1、概览 {#1概览}
本文简单地介绍了 Spring Boot 3 和 Spring Framework 6.0 中的新特性。
2、Java 17 {#2java-17}
之前已经支持Java 17,现在这个 LTS 版本成为基线版本。
由于 Java 本身不是本文的主题,这里只会列举对 Spring Boot 开发人员最重要的新特性。
2.1、Record {#21record}
Java Record(JEP 395),是一种快速创建数据类(Data Class)方式,即那些目的仅仅是包含数据并在模块之间传递数据的类,也被称为 POJO(Plain Old Java Objects,简单Java对象)和 DTO(Data Transfer Objects,数据传输对象)。
使用 Record 可以轻松创建不可变的 DTO:
public record Person (String name, String address) {}
目前,在将它们与 Bean Validation 结合使用时,需要小心,因为构造函数参数不支持验证约束,例如在 Controller 方法中的 JSON 对象。
2.2、字符块 {#22字符块}
通过 JEP 378,现在就可以创建多行文本块,而无需在换行时连接字符串:
String textBlock = """
Hello, this is a
multi-line
text block.
""";
2.3、Switch 表达式 {#23switch-表达式}
Java 12 引入了 switch 表达式 (JEP 361),它(与所有表达式一样)只计算一个值,并可在语句中使用。现在可以使用 switch-case
来代替嵌套的 if-else
操作符 (?:
)。
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、模式匹配 {#24模式匹配}
这有助于简化 instanceof
代码。
if (obj instanceof String s) {
System.out.println(s.toLowerCase());
}
还可以在 switch-case 语句中使用它:
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、密封类和接口 {#25密封类和接口}
密封类可以通过指定允许的子类来限制继承:
public abstract sealed class Pet permits Dog, Cat {}
更多详情,请参阅 官方文档。
3、Jakarta EE 9 {#3jakarta-ee-9}
最重要的变化可能是从 Java EE 跳转到 Jakarta EE 9,其中 package
命名空间从 javax.*
变为 jakarta.*
。因此,只要直接使用了 Java EE 中的类,就需要调整代码中的所有 import
。
例如,当访问 Spring MVC Controller
中的 HttpServletRequest
对象时,我们需要替换:
import javax.servlet.http.HttpServletRequest;
为:
import jakarta.servlet.http.HttpServletRequest;
特别是当使用 Bean Validation 和 JPA 时,这是不可避免的。
在使用依赖于 Java/Jakarta EE 的外部库时,也应注意这一点(例如 Hibernate Validator 7+、Tomcat 10+ 和 Jetty 11+)。
4、依赖版本 {#4依赖版本}
Spring Framework 6 和 Spring Boot 3 需要以下最低版本:
- Kotlin 1.7+
- Lombok 1.18.22+ (JDK17 support)
- Gradle 7.3+
5、要点 {#5要点}
有 2 个要点需要关注:本地可执行文件和可观察性(Observability)。
总结如下:
- Spring Framework 引入了核心抽象
- 组合项目始终与这些项目相结合
- Spring Boot 提供了自动配置功能
5.1、本地可执行文件 {#51本地可执行文件}
构建本地可执行文件并将其部署到 GraalVM 的优先级更高。因此,Spring Native 计划正在 向 Spring 本身转移。
AOT 生成,不需要包含单独的插件,只需使用 spring-boot-maven-plugin
的 新 goal 即可:
mvn spring-boot:aot-generate
Native Hint 也将成为 Spring 核心的一部分,(v6.0.0-M5)为此提供测试基础架构。
5.2、可观察性(Observability) {#52可观察性observability}
Spring 6 引入了 Spring Observability,这是一项建立在 Micrometer 和 Micrometer Tracing(前身为 Spring Cloud Sleuth)基础上的新计划。其目标是利用 Micrometer 高效记录应用程序指标,并通过 OpenZipkin 或 OpenTelemetry 等提供商实现追踪。
Spring Boot 3 对所有这些都进行了自动配置,Spring 项目使用新的 Observation API 对自己进行埋点。
6、Spring Web MVC 中的小改动 {#6spring-web-mvc-中的小改动}
最重要的新功能之一是 支持 RFC7807(Problem Details Standard)。
另一个较小的变化是,HttpMethod
不再是一个枚举,而是一个允许为扩展 HTTP 方法(如 WebDAV
定义的方法)创建实例的类:
HttpMethod lock = HttpMethod.valueOf("LOCK");
放弃了一些过时的基于 servlet 的集成,如 Commons FileUpload(Multipart 文件上传应使用 StandardServletMultipartResolver
)、Tiles 和 FreeMarker JSP 支持(应使用 FreeMarker 模板视图)。
7、项目迁移 {#7项目迁移}
建议的步骤如下:
- 迁移到 Spring Boot 2.7
- 检查过时的代码用法和遗留的配置文件处理;它们将在新的主要版本中删除。
- 迁移到 Java 17
- 检查第三方项目是否发布了与 Jakarta EE 9 兼容的版本
- 使用 Spring Boot 3 版本来测试迁移
参考:https://www.baeldung.com/spring-boot-3-spring-6-new