Spring Boot 3.5 新特性全解析:开发者必知的 10 大升级
Spring Boot 3.5 新特性全解析:开发者必知的 10 大升级
Spring Boot 3.5 不仅是版本号的提升,更是对现代 Java 应用开发的一次重要进化。
作为一名长期使用 Spring 生态的架构师,我一直关注着 Spring Boot 的每一次版本迭代。Spring Boot 3.5 的发布,带来了许多令人兴奋的新特性和改进,今天就和大家一起深度解析这些变化。
一、Java 22 虚拟线程集成
1.1 自动配置支持
// Spring Boot 3.5 自动配置虚拟线程 // 1. 无需额外配置,自动检测 Java 22+ 并启用虚拟线程 // application.properties spring.threads.virtual.enabled=true // 2. 自定义虚拟线程执行器 @Configuration public class VirtualThreadConfig { @Bean public ExecutorService virtualThreadExecutor() { return Executors.newVirtualThreadPerTaskExecutor(); } } // 3. 在 @Async 中使用 @Async("virtualThreadExecutor") public CompletableFuture<String> processAsync(String input) { // 处理逻辑 return CompletableFuture.completedFuture(result); }1.2 Web 服务器支持
// application.properties # 启用虚拟线程 (Tomcat/Jetty/Undertow 均支持) server.tomcat.threads.virtual.enabled=true # 配置虚拟线程名称前缀 server.tomcat.threads.virtual.name-prefix=spring-virtual-二、GraalVM Native Image 增强
2.1 简化的构建配置
pom.xml 配置:
<plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.10.2</version> <executions> <execution> <id>build-native</id> <goals> <goal>compile-no-fork</goal> </goals> <phase>package</phase> </execution> </executions> <configuration> <buildArgs> <arg>--no-fallback</arg> <arg>--enable-url-protocols=https</arg> </buildArgs> <mainClass>${start-class}</mainClass> </configuration> </plugin>2.2 运行时优化
┌─────────────────────────────────────────────────────────────┐ │ Native Image 性能对比 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 指标 JVM 模式 Native 模式 │ │ ──────────────────────────────────────────────────────── │ │ 启动时间 2-3 秒 0.1-0.3 秒 │ │ 内存使用 256MB+ 64-128MB │ │ 峰值性能 100% 105-110% │ │ 包大小 50MB+ 20-40MB │ │ 冷启动 慢 极快 │ │ │ └─────────────────────────────────────────────────────────────┘三、Observability 增强
3.1 Micrometer 1.12 集成
// 自动配置的观测性指标 @RestController public class OrderController { private final MeterRegistry meterRegistry; public OrderController(MeterRegistry meterRegistry) { this.meterRegistry = meterRegistry; } @PostMapping("/orders") public ResponseEntity<Order> createOrder(@RequestBody Order order) { // 记录订单创建指标 Counter.builder("orders.created") .tag("status", order.getStatus()) .tag("customer", order.getCustomerId()) .register(meterRegistry) .increment(); // 处理订单 return ResponseEntity.ok(order); } }3.2 OpenTelemetry 自动配置
# application.yaml management: tracing: sampling: probability: 1.0 propagation: type: b3 otlp: metrics: export: enabled: true endpoint: http://localhost:4317 tracing: export: enabled: true endpoint: http://localhost:4317四、数据访问增强
4.1 Spring Data JPA 3.3 新特性
// JPA 批量操作优化 @Repository public interface OrderRepository extends JpaRepository<Order, Long> { // 批量保存,自动优化为单条 SQL @Modifying @Query("UPDATE Order o SET o.status = :status WHERE o.id IN :ids") int updateStatusBatch(@Param("status") String status, @Param("ids") List<Long> ids); // 流式查询,适用于大数据集 @Query("SELECT o FROM Order o WHERE o.status = :status") Stream<Order> findByStatusStream(@Param("status") String status); }4.2 R2DBC 3.0 支持
// R2DBC 响应式数据访问 @Repository public interface ProductRepository extends ReactiveCrudRepository<Product, Long> { Flux<Product> findByCategory(String category); Mono<Product> findBySku(String sku); } // 响应式服务 @Service public class ProductService { private final ProductRepository repository; public ProductService(ProductRepository repository) { this.repository = repository; } public Flux<Product> getProductsByCategory(String category) { return repository.findByCategory(category) .filter(product -> product.getStock() > 0) .map(this::enrichProduct); } }五、安全增强
5.1 Spring Security 6.3 集成
// OAuth2 增强配置 @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(authorize -> authorize .requestMatchers("/public/**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 .loginPage("/login") .defaultSuccessUrl("/dashboard") ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt .jwtAuthenticationConverter(customJwtConverter()) ) ); return http.build(); } @Bean public JwtAuthenticationConverter customJwtConverter() { JwtAuthenticationConverter converter = new JwtAuthenticationConverter(); converter.setJwtGrantedAuthoritiesConverter(new CustomJwtGrantedAuthoritiesConverter()); return converter; } }5.2 密码加密增强
// BCrypt 增强配置 @Configuration public class PasswordEncoderConfig { @Bean public PasswordEncoder passwordEncoder() { // 增强的 BCrypt 编码器 return new BCryptPasswordEncoder(12); // 强度更高 } @Bean public UserDetailsService userDetailsService() { // 用户详情服务 return username -> { User user = userRepository.findByUsername(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); return org.springframework.security.core.userdetails.User .withUsername(user.getUsername()) .password(user.getPassword()) .roles(user.getRoles().toArray(new String[0])) .build(); }; } }六、测试增强
6.1 @RestClientTest 改进
// 测试 REST 客户端 @RestClientTest(ProductClient.class) public class ProductClientTest { @Autowired private ProductClient productClient; @Autowired private MockRestServiceServer server; @Test public void testGetProduct() { // 模拟响应 server.expect(requestTo("https://api.example.com/products/1")) .andRespond(withSuccess( "{\"id\": 1, \"name\": \"Product 1\", \"price\": 99.99}", MediaType.APPLICATION_JSON )); // 测试客户端 Product product = productClient.getProduct(1L); assertThat(product.getId()).isEqualTo(1L); assertThat(product.getName()).isEqualTo("Product 1"); server.verify(); } }6.2 @DataJpaTest 增强
// 测试 JPA 存储库 @DataJpaTest public class OrderRepositoryTest { @Autowired private OrderRepository orderRepository; @Autowired private TestEntityManager entityManager; @Test public void testFindByStatus() { // 准备测试数据 Order order1 = new Order(); order1.setStatus("PENDING"); entityManager.persist(order1); Order order2 = new Order(); order2.setStatus("COMPLETED"); entityManager.persist(order2); entityManager.flush(); // 测试查询 List<Order> pendingOrders = orderRepository.findByStatus("PENDING"); assertThat(pendingOrders).hasSize(1); assertThat(pendingOrders.get(0).getStatus()).isEqualTo("PENDING"); } }七、配置管理增强
7.1 分层配置支持
# application.yaml spring: config: import: - optional:classpath:config/common.yaml - optional:file:./config/override.yaml - optional:https://config-server.com/apps/${spring.application.name}/${spring.profiles.active} # 环境变量优先级 # 1. 命令行参数 # 2. 环境变量 # 3. 本地配置文件 # 4. 远程配置中心 # 5. 默认值7.2 配置验证
// 配置类验证 @ConfigurationProperties(prefix = "app") @Validated public class AppConfig { @NotNull @Size(min = 2, max = 50) private String name; @Min(1) @Max(100) private int maxConnections; @Pattern(regexp = "^https?://.*") private String apiUrl; // getters and setters } // 启用配置属性 @Configuration @EnableConfigurationProperties(AppConfig.class) public class AppConfigConfiguration { }八、Web 增强
8.1 Spring MVC 改进
// 控制器增强 @RestController @RequestMapping("/api/products") public class ProductController { private final ProductService productService; public ProductController(ProductService productService) { this.productService = productService; } @GetMapping public ResponseEntity<List<Product>> getProducts( @RequestParam(required = false) String category, @PageableDefault(size = 20) Pageable pageable) { Page<Product> products = productService.getProducts(category, pageable); return ResponseEntity.ok() .header("X-Total-Count", String.valueOf(products.getTotalElements())) .body(products.getContent()); } @PostMapping public ResponseEntity<Product> createProduct(@Valid @RequestBody Product product) { Product created = productService.createProduct(product); return ResponseEntity.created(URI.create("/api/products/" + created.getId())) .body(created); } }8.2 WebFlux 增强
// 响应式控制器 @RestController @RequestMapping("/api/orders") public class OrderController { private final OrderService orderService; public OrderController(OrderService orderService) { this.orderService = orderService; } @GetMapping public Flux<Order> getOrders( @RequestParam(required = false) String status) { return orderService.getOrders(status) .delayElements(Duration.ofMillis(100)); // 模拟异步处理 } @PostMapping public Mono<ResponseEntity<Order>> createOrder( @Valid @RequestBody Mono<Order> orderMono) { return orderService.createOrder(orderMono) .map(order -> ResponseEntity.created( URI.create("/api/orders/" + order.getId()) ).body(order)); } }九、DevTools 改进
9.1 热重载增强
# application-dev.yaml spring: devtools: restart: enabled: true additional-paths: src/main/resources exclude: "static/**,public/**" livereload: enabled: true remote: enabled: true context-path: /devtools9.2 全局设置
// .spring-boot-devtools.properties restart.include.mylib=/mylib-[\w-]+\.jar restart.exclude.companylibs=/company-[\w-]+\.jar restart.exclude.spring-boot=/spring-boot-[\w-]+\.jar十、容器化支持
10.1 Docker 构建增强
Dockerfile 最佳实践:
# 多阶段构建 FROM eclipse-temurin:22-jdk-alpine AS builder WORKDIR /app COPY . . RUN ./mvnw package -DskipTests FROM eclipse-temurin:22-jre-alpine WORKDIR /app COPY --from=builder /app/target/*.jar app.jar # 启用虚拟线程 ENV JAVA_OPTS="--enable-preview" # 健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]10.2 Kubernetes 集成
application-k8s.yaml:
spring: cloud: kubernetes: config: enabled: true secrets: enabled: true reload: enabled: true mode: polling period: 15s management: endpoints: web: exposure: include: health,info,prometheus endpoint: health: show-details: always十一、总结与迁移建议
11.1 升级步骤
┌─────────────────────────────────────────────────────────────┐ │ 升级步骤 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 检查 Java 版本:确保使用 Java 21+ │ │ 2. 更新 pom.xml:将 Spring Boot 版本改为 3.5.0 │ │ 3. 检查依赖:更新相关 Spring 生态依赖 │ │ 4. 测试应用:运行完整测试套件 │ │ 5. 性能测试:验证新特性带来的性能提升 │ │ 6. 部署上线:采用灰度发布策略 │ │ │ └─────────────────────────────────────────────────────────────┘11.2 最佳实践
- 逐步采用新特性:从非核心服务开始尝试虚拟线程和 Native Image
- 监控性能变化:使用 Micrometer 监控升级前后的性能差异
- 优化配置:根据实际需求调整新的配置项
- 持续集成:在 CI/CD 流程中加入新特性的测试
Spring Boot 3.5 的发布,为 Java 开发者带来了许多实用的新特性和改进。无论是虚拟线程的集成、GraalVM Native Image 的优化,还是观测性的增强,都体现了 Spring 团队对现代应用开发需求的深刻理解。
这其实可以更优雅一点。Spring Boot 3.5 让我们能够用更简洁的代码、更高效的性能、更可靠的架构来构建现代 Java 应用。
别叫我大神,叫我 Alex 就好。希望这篇文章能帮助你更好地理解和应用 Spring Boot 3.5 的新特性,让你的开发工作更加得心应手。
附:Spring Boot 3.5 新特性速查表
- Java 22 虚拟线程集成
- GraalVM Native Image 增强
- Micrometer 1.12 集成
- OpenTelemetry 自动配置
- Spring Data JPA 3.3 新特性
- R2DBC 3.0 支持
- Spring Security 6.3 集成
- 测试框架增强
- 配置管理改进
- Web 框架增强
- DevTools 改进
- 容器化支持
Spring Boot 3.5,值得你升级!
