← Назад к вопросам

Что нового появилось в Spring Boot 2

2.0 Middle🔥 121 комментариев
#Stream API и функциональное программирование#Многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Новые возможности в 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 приложений.

Что нового появилось в Spring Boot 2 | PrepBro