51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Spring Boot 3 和 Spring Framework 6.0 - 新功能

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

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

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

建议的步骤如下:

  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

赞(1)
未经允许不得转载:工具盒子 » Spring Boot 3 和 Spring Framework 6.0 - 新功能