Spring Boot 3.2(2023年11月发布)是一个里程碑式的重要版本,核心是全面拥抱 Java 21 LTS,并以虚拟线程、CRaC、可观测性增强和全新客户端API为四大支柱,显著提升了云原生时代的并发性能、启动速度、开发效率与运维能力。
一、核心基础:Java 21 LTS 深度兼容
Spring Boot 3.2 最低要求 JDK 17,但原生支持并强烈推荐 JDK 21(最新LTS版本),全面解锁以下关键优化:
- 虚拟线程 (Virtual Threads, JEP 444):核心特性,彻底革新并发模型。
- 分代 ZGC / youg G1:GC 停顿时间降至 1ms 以下,超大堆应用更稳定。
- 模式匹配、Record 增强、Sequenced Collections:简化代码,提升开发效率与性能。
- 字符串压缩优化:降低内存占用,提升字符串处理速度。
注意:目前企业开发主流还是使用 Java17
二、重磅新特性详解
1. 虚拟线程 (Virtual Threads):高并发革命
核心价值:为传统阻塞式(Servlet)编程模型带来近似响应式(Reactive)的超高并发能力,代码无需改写。
- 原理:虚拟线程是 JVM 管理的轻量级线程,不与 OS 线程一一绑定。内存占用极小(KB级 vs 平台线程MB级),上下文切换成本极低。
- 一键启用:
# application.properties
spring.threads.virtual.enabled=true
- 自动适配:Tomcat、Jetty、Undertow 三大服务器及
@Async任务自动切换为虚拟线程执行。 - 性能收益:
- I/O密集型应用(API网关、数据库访问):吞吐量提升10倍+,内存占用减少90%。
- 适用场景:推荐用于所有 Web 服务、第三方API调用、DB操作等阻塞任务;CPU密集型任务仍建议用平台线程池。
2. CRaC (Coordinated Restore at Checkpoint):毫秒级启动
核心价值:解决 Java 应用“启动慢、预热久”的痛点,实现秒级甚至毫秒级启动与恢复。
- 原理:在应用启动完成、预热完毕后创建一个内存快照(Checkpoint)。后续重启时直接从快照恢复(Restore),跳过所有类加载、初始化过程。
- 支持状态:3.2为生产就绪(Production Ready),支持 Jetty 和 Tomcat。
- 典型场景:
- Serverless/FaaS:应对冷启动,实现真正的弹性扩缩容。
- K8s滚动更新:新Pod秒级就绪,无流量损失。
3. 全新声明式客户端:RestClient & JdbcClient
核心价值:提供比 RestTemplate 更现代、比 WebClient 更简单的流式API,大幅简化 HTTP 与 JDBC 代码。
(1) RestClient(替代 RestTemplate)
- 特性:同步、流式、声明式API,内置 JSON 处理,与 Spring 生态无缝整合。
代码示例:
@Service public class UserService { private final RestClient restClient; // 自动注入或通过RestClient.builder创建 public UserService(RestClient.Builder restClientBuilder) { this.restClient = restClientBuilder.baseUrl("https://api.example.com").build(); } public User getUserById(Long id) { return restClient.get() .uri("/users/{id}", id) // 路径参数 .retrieve() // 执行请求 .body(User.class); // 直接转换为对象 } }
(2) JdbcClient(简化 JDBC 操作)
- 特性:流式API,简化
RowMapper、参数绑定、查询与更新操作,可读性极强。 代码示例:
@Repository public class JdbcUserRepository { private final JdbcClient jdbcClient; public JdbcUserRepository(JdbcClient jdbcClient) { this.jdbcClient = jdbcClient; } // 查询单个对象 public Optional<User> findById(Long id) { return jdbcClient.sql("SELECT id, name FROM users WHERE id = :id") .param("id", id) // 命名参数 .query(User.class) // 直接映射 .optional(); } // 批量更新 public void batchInsert(List<User> users) { jdbcClient.sql("INSERT INTO users(name) VALUES (?)") .batch(users, (user, ps) -> ps.setString(1, user.getName())) .update(); } }
4. 可观测性(Observability)全面增强
基于 Micrometer 深度整合,零配置或极简配置获得强大监控能力:
- 自动注解支持:
@Timed(计时),@Counted(计数),@Observed(全链路追踪) 等注解自动生效。 - 覆盖范围扩大:
- 支持
@Scheduled定时任务的监控。 - 支持 R2DBC(响应式数据库)的指标与追踪。
- B3 追踪协议默认格式优化,兼容性更好。
- 支持
- 日志集成:日志默认自动包含
traceId、spanId和applicationName,无需手动配置MDC。
5. SSL Bundles:统一、热重载的SSL管理
核心价值:集中管理所有SSL证书(Keystores、Truststores),支持热更新,无需重启应用。
- 应用场景:数据库(PostgreSQL/MySQL)、消息队列(Kafka/RabbitMQ)、HTTPS 服务的证书统一配置。
- 配置示例:
# 定义SSL Bundle spring.ssl.bundle.pem.my-bundle.certificate=classpath:cert.crt spring.ssl.bundle.pem.my-bundle.certificate-private-key=classpath:cert.key # 应用到DataSource spring.datasource.hikari.ssl-bundle=my-bundle
6. 其他重要升级
- 嵌入式服务器:全面支持 Jetty 12。
- 消息队列:新增 Spring for Apache Pulsar 自动配置;Kafka/RabbitMQ 支持 SSL Bundles。
- Docker 镜像构建:
spring-boot:build-image插件优化,构建速度更快、镜像更小,支持分层优化。 - 嵌套JAR重构:重新设计了嵌套JAR的加载机制,启动更快、内存占用更低,兼容性更强。
- 依赖升级:基于 Spring Framework 6.1、Spring Security 6.2、Hibernate 6.4、Tomcat 10.1+ 等。
三、性能提升总结
- 启动速度:配合 AOT / GraalVM 原生镜像,启动从秒级降至毫秒级。
- 并发能力:虚拟线程使 I/O 密集型应用吞吐量提升 5-10 倍。
- 内存效率:虚拟线程 + 字符串压缩,内存占用降低 30%-90%。
- GC 表现:JDK 21 分代 ZGC,停顿时间 < 1ms,服务几乎无抖动。
四、升级注意事项
- 基线要求:JDK 17+,Jakarta EE 9+(
javax包名已全部改为jakarta)。 - 参数名发现:Spring Framework 6.1 不再自动解析字节码获取参数名。编译时必须添加
-parameters参数(Maven/Gradle 需配置)。 - 弃用清理:移除了所有 3.0 版本中标记为 @Deprecated 的类和方法。
- 虚拟线程注意:
- 避免在虚拟线程中使用 ThreadLocal(因虚拟线程数量巨大,易导致内存泄漏)。
- 同步块 (
synchronized) 性能较低,建议改用Lock接口。
五、总结与适用场景
Spring Boot 3.2 是 Java 开发者迈向云原生、高并发、快启动时代的关键一步。
- 强烈建议升级:所有新项目直接使用 3.2+;老项目(3.x)尽快升级以获取虚拟线程与 CRaC 能力。
- 最佳组合:Spring Boot 3.2 + JDK 21 + GraalVM/CRaC,构建极致性能、极致弹性的现代 Java 应用。