1. 概述
随着 Spring Boot 3 发布临近,现在正是了解其新特性的好时机。本次升级不仅是版本迭代,更是技术栈的全面革新。
2. Java 17
Java 17 成为 Spring Boot 3 的基准版本。从 Java 11 迁移的开发者将获得显著的语言特性提升。以下重点介绍对 Spring 开发最有价值的新特性:
2.1. Records 类
Records (JEP 395) 提供了创建数据载体类的简洁方式(如 POJO/DTO):
public record Person (String name, String address) {}
踩坑提示:当前 Records 与 Bean Validation 集成存在限制,构造函数参数不支持验证注解(如 JSON 反序列化场景)。
2.2. 文本块
通过 JEP 378 实现多行文本,告别字符串拼接地狱:
String textBlock = """
Hello, this is a
multi-line
text block.
""";
2.3. Switch 表达式
Switch 表达式(Java 12+)简化条件判断:
DayOfWeek day = DayOfWeek.FRIDAY;
int numOfLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
2.4. 模式匹配
简化 instanceof
判断(Project Amber):
// instanceof 直接匹配
if (obj instanceof String s) {
System.out.println(s.toLowerCase());
}
// switch 模式匹配
static double getDoubleUsingSwitch(Object o) {
return switch (o) {
case Integer i -> i.doubleValue();
case Float f -> f.doubleValue();
case String s -> Double.parseDouble(s);
default -> 0d;
};
}
2.5. 密封类
通过 sealed
限制继承范围:
public abstract sealed class Pet permits Dog, Cat {}
3. Jakarta EE 9
最重大的变化是 Java EE 到 Jakarta EE 9 的迁移,包名从 javax.*
变为 jakarta.*
。典型影响:
// 旧版本
import javax.servlet.http.HttpServletRequest;
// 新版本
import jakarta.servlet.http.HttpServletRequest;
关键影响:
- 所有直接使用 Java EE API 的代码需修改
- 第三方库需兼容 Jakarta EE 9(如 Hibernate Validator 7+、Tomcat 10+)
4. 依赖版本要求
Spring Framework 6 和 Spring Boot 3 的最低依赖版本:
- Kotlin 1.7+
- Lombok 1.18.22+(需 JDK17 支持)
- Gradle 7.3+
5. 核心升级方向
两大重点:Native 可执行文件 和 可观测性。Spring 生态通过三级支持实现:
- Spring Framework 提供核心抽象
- 子项目统一集成
- Spring Boot 自动配置
5.1. Native 可执行文件
Spring Native 正式并入 Spring 主线。AOT 编译现在通过 Maven 插件原生支持:
mvn spring-boot:aot-generate
升级亮点:
- 无需额外插件
- Native Hints 集成到 Spring 核心
- 测试基础设施随 M5 版本提供
5.2. 可观测性
基于 Micrometer 和 Micrometer Tracing(原 Spring Cloud Sleuth)构建的观测体系:
graph LR
A[应用] --> B[Micrometer]
B --> C[指标收集]
B --> D[分布式追踪]
D --> E[OpenZipkin/OpenTelemetry]
Spring Boot 3 提供全套自动配置,所有 Spring 项目正通过新 Observation API 实现自观测。
6. Spring Web MVC 细节优化
6.1. RFC7807 问题详情支持
原生支持 RFC7807 问题详情标准,无需再依赖 Zalando Problem 等库。
6.2. HttpMethod 类升级
HttpMethod
从枚举改为类,支持扩展 HTTP 方法(如 WebDAV):
HttpMethod lock = HttpMethod.valueOf("LOCK");
6.3. 废弃组件清理
移除过时的 Servlet 集成:
- Commons FileUpload → 改用
StandardServletMultipartResolver
- Tiles 和 FreeMarker JSP 支持 → 改用 FreeMarker 模板视图
7. 项目迁移路径
推荐迁移步骤:
- 升级到 Spring Boot 2.7(官方迁移指南将基于此版本)
- 清理废弃代码和旧版配置文件处理
- 迁移到 Java 17
- 确认第三方库兼容 Jakarta EE 9
- 使用当前里程碑版本测试迁移
8. 总结
Spring Boot 3 迁移本质是三重升级:
- Java 17 基线
- Jakarta EE 9 生态
- 原生编译与可观测性支持
收益最大化场景:需要极致启动性能(Native 编译)或深度监控(可观测性)的项目。
所有示例代码可在 GitHub 获取。