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.enabledtrue // 2. 自定义虚拟线程执行器 Configuration public class VirtualThreadConfig { Bean public ExecutorService virtualThreadExecutor() { return Executors.newVirtualThreadPerTaskExecutor(); } } // 3. 在 Async 中使用 Async(virtualThreadExecutor) public CompletableFutureString processAsync(String input) { // 处理逻辑 return CompletableFuture.completedFuture(result); }1.2 Web 服务器支持// application.properties # 启用虚拟线程 (Tomcat/Jetty/Undertow 均支持) server.tomcat.threads.virtual.enabledtrue # 配置虚拟线程名称前缀 server.tomcat.threads.virtual.name-prefixspring-virtual-二、GraalVM Native Image 增强2.1 简化的构建配置pom.xml 配置plugin groupIdorg.graalvm.buildtools/groupId artifactIdnative-maven-plugin/artifactId version0.10.2/version executions execution idbuild-native/id goals goalcompile-no-fork/goal /goals phasepackage/phase /execution /executions configuration buildArgs arg--no-fallback/arg arg--enable-url-protocolshttps/arg /buildArgs mainClass${start-class}/mainClass /configuration /plugin2.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 ResponseEntityOrder 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 JpaRepositoryOrder, Long { // 批量保存自动优化为单条 SQL Modifying Query(UPDATE Order o SET o.status :status WHERE o.id IN :ids) int updateStatusBatch(Param(status) String status, Param(ids) ListLong ids); // 流式查询适用于大数据集 Query(SELECT o FROM Order o WHERE o.status :status) StreamOrder findByStatusStream(Param(status) String status); }4.2 R2DBC 3.0 支持// R2DBC 响应式数据访问 Repository public interface ProductRepository extends ReactiveCrudRepositoryProduct, Long { FluxProduct findByCategory(String category); MonoProduct findBySku(String sku); } // 响应式服务 Service public class ProductService { private final ProductRepository repository; public ProductService(ProductRepository repository) { this.repository repository; } public FluxProduct 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(); // 测试查询 ListOrder 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 ResponseEntityListProduct getProducts( RequestParam(required false) String category, PageableDefault(size 20) Pageable pageable) { PageProduct products productService.getProducts(category, pageable); return ResponseEntity.ok() .header(X-Total-Count, String.valueOf(products.getTotalElements())) .body(products.getContent()); } PostMapping public ResponseEntityProduct 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 FluxOrder getOrders( RequestParam(required false) String status) { return orderService.getOrders(status) .delayElements(Duration.ofMillis(100)); // 模拟异步处理 } PostMapping public MonoResponseEntityOrder createOrder( Valid RequestBody MonoOrder 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 --frombuilder /app/target/*.jar app.jar # 启用虚拟线程 ENV JAVA_OPTS--enable-preview # 健康检查 HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD wget -qO- http://localhost:8080/actuator/health || exit 1 EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]10.2 Kubernetes 集成application-k8s.yamlspring: 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值得你升级