Spring Boot 3 和 Spring Framework 6.0 - 新功能

1、概览

本文简单地介绍了 Spring Boot 3 和 Spring Framework 6.0 中的新特性。

2、Java 17

之前已经支持Java 17,现在这个 LTS 版本成为基线版本。

由于 Java 本身不是本文的主题,这里只会列举对 Spring Boot 开发人员最重要的新特性。

2.1、Record

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、字符块

通过 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、模式匹配

这有助于简化 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 {}

更多详情,请参阅 官方文档

3、Jakarta 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、依赖版本

Spring Framework 6 和 Spring Boot 3 需要以下最低版本:

5、要点

有 2 个要点需要关注:本地可执行文件和可观察性(Observability)。

总结如下:

  • Spring Framework 引入了核心抽象
  • 组合项目始终与这些项目相结合
  • Spring Boot 提供了自动配置功能

5.1、本地可执行文件

构建本地可执行文件并将其部署到 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)

Spring 6 引入了 Spring Observability,这是一项建立在 Micrometer 和 Micrometer Tracing(前身为 Spring Cloud Sleuth)基础上的新计划。其目标是利用 Micrometer 高效记录应用程序指标,并通过 OpenZipkinOpenTelemetry 等提供商实现追踪。

Spring Boot 3 对所有这些都进行了自动配置,Spring 项目使用新的 Observation API 对自己进行埋点。

6、Spring Web MVC 中的小改动

最重要的新功能之一是 支持 RFC7807(Problem Details Standard)。

另一个较小的变化是,HttpMethod 不再是一个枚举,而是一个允许为扩展 HTTP 方法(如 WebDAV 定义的方法)创建实例的类:

HttpMethod lock = HttpMethod.valueOf("LOCK");

放弃了一些过时的基于 servlet 的集成,如 Commons FileUpload(Multipart 文件上传应使用 StandardServletMultipartResolver)、Tiles 和 FreeMarker JSP 支持(应使用 FreeMarker 模板视图)。

7、项目迁移

建议的步骤如下:

  1. 迁移到 Spring Boot 2.7
  2. 检查过时的代码用法和遗留的配置文件处理;它们将在新的主要版本中删除。
  3. 迁移到 Java 17
  4. 检查第三方项目是否发布了与 Jakarta EE 9 兼容的版本
  5. 使用 Spring Boot 3 版本来测试迁移

参考:https://www.baeldung.com/spring-boot-3-spring-6-new