一、概述
距离Spring Boot 3 的发布只有3 个月的时间。Spring Framework 6.0 可能会在Spring Boot 3 之前不久出现。所以现在是检查新功能的好时机。
2.Java 17
虽然之前已经支持Java 17,但这个LTS 版本现在获得了基线。
从LTS 版本11 迁移时,Java 开发人员受益于新的语言特性。因为在本文中,Java 本身不是主题,所以我们只命名Spring Boot 开发人员最重要的新特性。我们可以在Java 17、16、15、14、13 和12 的单独文章中找到任何详细信息。
2.1。记录
引入Java 记录(JEP 395,参见Java 14 记录关键字)旨在用作创建数据载体类的快速方法,即目标是简单地包含数据并在模块之间携带数据的类,也称为POJO (普通的旧Java 对象)和DTO(数据传输对象)。
我们可以轻松创建不可变的DTO:
public record Person (String name, String address) {}
目前,我们在将它们与Bean Validation结合时需要小心,因为构造函数参数不支持验证约束,例如,当实例在JSON 反序列化(Jackson) 上创建并作为参数放入控制器的方法时。
2.2.文本块
使用JEP 378,现在可以创建多行文本块,而无需在换行符处连接字符串:
String textBlock = """
Hello, this is a
multi-line
text block.
""";
2.3.切换表达式
Java 12 引入了switch 表达式( JEP 361 ),它(像所有表达式一样)评估单个值,并且可以在语句中使用。代替组合嵌套的if
– else
-operators ( ?:
:),我们现在可以使用switch
– case
-construct:
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.模式匹配
模式匹配在Amber 项目中得到了详细阐述,并在Java 语言中得到了体现。在Java 语言的情况下,它们可以帮助简化instanceof
评估的代码。
我们可以直接将它们与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.雅加达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 Validator 7+、Tomcat 10+ 和Jetty 11+)。
4. 进一步的依赖
Spring Framework 6 和Spring Boot 3 需要以下最低版本:
科特林1.7+
Lombok 1.18.22+(JDK17支持)
摇篮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 核心的一部分。Milestone 5 (v6.0.0-M5) 将提供为此的测试基础架构。
5.2.可观察性
Spring 6 引入了Spring Observability——一个基于Spring Cloud Sleuth的新项目。它更适合使用Micrometer有效地记录应用程序指标,并通过OpenZipkin或OpenTelemetry等提供程序实现跟踪。
Spring Observability 得分优于以前基于代理的可观察性,因为它在本机编译的Spring 应用程序中无缝工作,以更有效地提供更好的信息。
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。如果我们非常重视可观察性和原生可执行文件,我们将从即将发布的主要版本中受益最多。
0 评论