Что нового появилось в Spring Boot 2
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Новые возможности в Spring Boot 2.x
Spring Boot 2.x принесла множество улучшений и новых возможностей. Рассмотрю самые значимые из них, которые используются в production коде.
1. WebFlux и Reactive Programming
Одно из главных добавлений - поддержка reactive подхода через Spring WebFlux.
// Традиционный блокирующий подход (Spring MVC)
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public UserDto getUser(@PathVariable Long id) {
// Блокирует thread пока ждем ответа от БД
return userService.findById(id);
}
}
// Новый reactive подход (Spring WebFlux)
@RestController
@RequestMapping("/api/users")
public class ReactiveUserController {
@GetMapping("/{id}")
public Mono<UserDto> getUser(@PathVariable Long id) {
// Не блокирует thread, использует асинхронные callback'и
return userService.findByIdReactive(id);
}
}
@Service
public class ReactiveUserService {
private final R2dbcUserRepository userRepository;
public Mono<UserDto> findByIdReactive(Long id) {
return userRepository.findById(id)
.map(this::mapToDto)
.onErrorResume(ex -> Mono.error(new UserNotFoundException()));
}
public Flux<UserDto> findAllReactive() {
return userRepository.findAll()
.map(this::mapToDto);
}
}
Плюсы WebFlux:
- Использует меньше потоков (thread pool улучшение)
- Лучше справляется с I/O bound операциями
- Больше масштабируемость
Когда использовать:
- Высоконагруженные системы
- Много I/O операций (запросы к БД, микросервисы)
- Нужна высокая масштабируемость
2. Улучшения в Actuator
Actuator предоставляет monitoring и metrics для приложения.
# application.yml
management:
endpoints:
web:
exposure:
include: health,metrics,info,prometheus
endpoint:
health:
show-details: when-authorized
metrics:
export:
prometheus:
enabled: true
// Использование встроенных метрик
@Service
public class OrderService {
private final MeterRegistry meterRegistry;
public OrderService(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
public void processOrder(Order order) {
try {
// Бизнес логика
meterRegistry.counter("orders.processed").increment();
} catch (Exception e) {
meterRegistry.counter("orders.failed").increment();
throw e;
}
}
}
// Custom метрики
@Component
public class CustomMetrics {
public CustomMetrics(MeterRegistry registry) {
registry.gauge("custom.database.connections", () -> getActiveConnections());
}
private int getActiveConnections() {
// Получить количество активных соединений
return 0;
}
}
3. Улучшено управление зависимостями
Spring Boot 2 автоматически управляет версиями зависимостей.
<!-- pom.xml -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
</parent>
<dependencies>
<!-- Версия не нужна, она будет управляться parent'ом -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
4. Изолированные тесты
Новые @WebMvcTest и @DataJpaTest аннотации для более быстрых тестов.
// Тестируем только Controller слой
@WebMvcTest(UserController.class)
public class UserControllerTest {
@MockBean
private UserService userService;
@Autowired
private MockMvc mockMvc;
@Test
void testGetUser() throws Exception {
Long userId = 1L;
UserDto userDto = new UserDto(userId, "John", "john@example.com");
when(userService.findById(userId)).thenReturn(userDto);
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John"));
}
}
// Тестируем только JPA слой
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
void testFindByEmail() {
User user = new User();
user.setEmail("john@example.com");
userRepository.save(user);
Optional<User> found = userRepository.findByEmail("john@example.com");
assertThat(found).isPresent();
}
}
5. Поддержка Java 11+ features
Spring Boot 2 поддерживает новые Java версии и их features.
// var keyword (Java 10+)
@Service
public class ModernService {
public void processData() {
var users = userRepository.findAll(); // var вместо List<User>
var count = users.size();
users.forEach(user -> {
var email = user.getEmail(); // Более читаемо
});
}
}
// Records (Java 14+ preview, Java 16+ production)
record UserDto(Long id, String name, String email) {}
// Text blocks (Java 13+)
@Service
public class QueryService {
private static final String QUERY = """
SELECT u.id, u.name, u.email
FROM users u
WHERE u.active = true
ORDER BY u.created_at DESC
""";
}
6. Улучшено конфигурирование
Больше опций для конфигурации через properties и yaml.
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/db
username: root
password: secret
hikari:
maximum-pool-size: 20
minimum-idle: 5
jpa:
hibernate:
ddl-auto: validate
show-sql: false
properties:
hibernate:
format_sql: true
use_sql_comments: true
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://auth.example.com
// Type-safe конфигурация
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {
private final AppProperties appProperties;
public AppConfig(AppProperties appProperties) {
this.appProperties = appProperties;
}
}
@ConfigurationProperties(prefix = "app")
@Data
public class AppProperties {
private String name;
private String version;
private Security security = new Security();
@Data
public static class Security {
private String jwtSecret;
private long jwtExpiration;
}
}
7. Улучшена безопасность
Spring Security 5 предоставляет более гибкие опции.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(jwt -> jwt
.decoder(jwtDecoder())
.jwtAuthenticationConverter(jwtAuthenticationConverter())
)
);
return http.build();
}
}
8. GraalVM Native Image поддержка
Создание native приложений для faster startup и меньше памяти.
<!-- pom.xml для native image -->
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
# Компилирование в native executable
mvn -Pnative native:compile
# Результат: очень быстрый старт (~50ms вместо ~3s)
9. Улучшения в Spring Data
Поддержка более сложных запросов и проекций.
public interface UserRepository extends JpaRepository<User, Long> {
// Проекция для получения только определенных полей
@Query("SELECT new com.example.UserProjection(u.id, u.name) FROM User u")
List<UserProjection> findAllUserProjections();
// Named queries
List<User> findByActiveAndCreatedAtAfter(boolean active, LocalDateTime date);
}
// DTO projection
interface UserSummary {
Long getId();
String getName();
String getEmail();
}
public interface UserRepository extends JpaRepository<User, Long> {
List<UserSummary> findAllProjectedBy();
}
Резюме новых возможностей Spring Boot 2.x
- WebFlux для reactive приложений
- Улучшенный Actuator для monitoring и metrics
- Лучшее управление зависимостями
- Изолированные тесты через специальные аннотации
- Поддержка Java 11+ features (var, records, text blocks)
- GraalVM Native Image для быстрого старта
- Улучшена Spring Security с современными подходами
- Type-safe конфигурация через @ConfigurationProperties
- Улучшена Spring Data с проекциями и сложными запросами
Эти улучшения делают Spring Boot 2.x мощным фреймворком для разработки современных Java приложений.