Spring Boot 3 和 Spring Framework 6.0 – 新增功能

652 阅读5分钟

原文: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、1312 的单独文章中找到更多详细信息。

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 需要以下最低版本:

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有效地记录应用程序指标,并通过OpenZipkinOpenTelemetry等提供商实现跟踪。

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. 迁移项目

我们应该知道一些项目迁移的提示。建议的步骤是:

  1. 迁移到 Spring Boot 2.7(当 Spring Boot 3 发布时,会有基于Spring Boot 2.7 的迁移指南)
  2. 检查已弃用的代码使用情况和旧版配置文件处理;它将随着新的主要版本而被删除
  3. 迁移到 Java 17
  4. 检查第三方项目是否具有与 Jakarta EE 9 兼容的版本
  5. 由于 Spring Boot 3 尚未发布,我们可以尝试当前的里程碑来测试迁移

8. 结论

正如我们所了解到的,迁移到Spring Boot 3和Spring 6也将是迁移到Java 17和Jakarta EE 9。如果我们非常重视可观测性和本机可执行文件,我们将从即将发布的主要版本中受益最多。

与往常一样,所有代码都可以在GitHub上找到。