原文:Spring Boot 3 and Spring Framework 6.0 – What’s New | Baeldung
1. 概述
Spring Boot 3的发布只有很短的时间,现在似乎是查看新功能的好时机。
2. Java 17
虽然之前已经支持 Java 17,但这个 LTS 版本现在有了基线。
从 LTS 版本 11 迁移时,Java 开发人员将受益于新的语言功能。由于Java本身不是本文的主题,因此我们仅列出Spring Boot开发人员最重要的新功能。我们可以在 Java17、16、15、14、13 和 12 的单独文章中找到更多详细信息。
2.1. Records记录
Java Records(JEP 395,参见Java14 Record 关键字)旨在用作创建数据载体类的快速方法,即其目标是简单地包含数据并在模块之间传输数据的类,也称为POJO(普通旧Java对象)和DTO(数据传输对象)。
我们可以轻松创建不可变的 DTO:
public record Person (String name, String address) {}
目前,在将它们与Bean验证结合使用时需要小心,因为构造函数参数不支持验证约束,例如在 JSON 反序列化 (Jackson) 上创建实例并作为参数放入控制器的方法时。
2.2. 文本块
使用JEP 378,现在可以创建多行文本块,而无需在换行符上连接字符串:
String textBlock = """
Hello, this is a
multi-line
text block.
""";
2.3. switch表达式
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. Pattern Matching模式匹配
模式匹配在琥珀项目中得到了阐述,并找到了Java语言的途径。在Java语言中,它们可以帮助简化评估实例的代码。我们可以直接将它们与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. 密封类和接口
密封类可以通过指定允许的子类来限制继承:
public abstract sealed class Pet permits Dog, Cat {}
我们可以在Java 中的密封类和接口中找到更多详细信息。
3. Jakarta EE 9
最重要的变化可能是从Java EE跳转到Jakarta EE9,其中包命名空间从javax.更改为jakarta.。因此,每当我们直接使用 Java EE 中的类时,我们都需要调整代码中的所有导入。
例如,当我们在Spring MVC控制器中访问HttpServletRequest对象时,我们需要替换:
import javax.servlet.http.HttpServletRequest;
跟:
import jakarta.servlet.http.HttpServletRequest;
当然,我们不必经常使用 Servlet API 的类型,但是如果我们使用 bean 验证和 JPA,这是不可避免的。
当我们使用依赖于Java / Jakarta EE的外部库时,我们也应该意识到这一点(例如,我们必须使用Hibernate验证器7+,Tomcat 10+和Jetty 11+)。
4. 进一步的依赖关系
Spring Framework 6 和 Spring Boot 3 需要以下最低版本:
- Kotlin 1.7+
- Lombok 1.18.22+(JDK17 支持)
- Gradle 7.3+
5. 重点
两个总体主题受到特别关注:本机可执行文件(Native Executables)和可观测性(Observability)。总体意味着:
- Spring 框架引入了核心抽象
- 项目组合项目始终与他们集成
- Spring Boot 提供自动配置
5.1. 本机可执行文件
构建本机可执行文件并将其部署到 GraalVM 具有更高的优先级。因此,Spring Native计划正在进入Spring。
对于 AOT 生成,没有必要包含单独的插件,我们只需使用spring-boot-maven-plugin 的新目标:
mvn spring-boot:aot-generate
Native Hints也将成为Spring核心的一部分。与此相关的测试基础结构将在里程碑 5 (v6.0.0-M5) 中提供。
5.2. 可观测性
在Spring 6中,有一个可观测性计划最终产生了一个新的Micrometer 观察API,并且以前的Spring Cloud Sleuth项目迁移到Micrometer跟踪。这更多地是为了使用Micrometer有效地记录应用程序指标,并通过OpenZipkin或OpenTelemetry等提供商实现跟踪。
Spring Boot 3 中对所有这些进行了自动配置,Spring 项目正在使用观察 API 进行自我检测。
6. Spring Web MVC 中的较小变化
最重要的新功能之一是对RFC7807(问题详细信息标准)的支持。现在我们不需要包含单独的库,比如Zalando Problem。
另一个较小的变化是HttpMethod不再是一个枚举,而是一个允许我们为扩展的 HTTP 方法创建实例的类,例如 WebDAV 定义的实例:
HttpMethod lock = HttpMethod.valueOf("LOCK");
至少删除了一些过时的基于 servlet 的集成,例如 Commons FileUpload(我们应该使用StandardServletMultipartResolver进行多部分文件上传)、Tiles 和 FreeMarker JSP 支持(我们应该使用FreeMarker 模板视图)。
7. 迁移项目
我们应该知道一些项目迁移的提示。建议的步骤是:
- 迁移到 Spring Boot 2.7(当 Spring Boot 3 发布时,会有基于Spring Boot 2.7 的迁移指南)
- 检查已弃用的代码使用情况和旧版配置文件处理;它将随着新的主要版本而被删除
- 迁移到 Java 17
- 检查第三方项目是否具有与 Jakarta EE 9 兼容的版本
- 由于 Spring Boot 3 尚未发布,我们可以尝试当前的里程碑来测试迁移
8. 结论
正如我们所了解到的,迁移到Spring Boot 3和Spring 6也将是迁移到Java 17和Jakarta EE 9。如果我们非常重视可观测性和本机可执行文件,我们将从即将发布的主要版本中受益最多。
与往常一样,所有代码都可以在GitHub上找到。