1. 概述
在 Spring Boot 3.0 發佈前僅剩不久的時間內,現在是時候瞭解一下新功能了。 Spring Boot 3.0 的發佈即將來臨。
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(Plain Old Java Object)和 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 引入了表達式語句 (JEP 361),它(就像所有表達式一樣)評估單個值,並且可以用於語句。 相比於使用嵌套的 <em >if</em >–<em >else</em >> 運算符,現在我們可以使用 <em >switch</em >–<em >case</em >> 結構:
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. 模式匹配
模式匹配是在 Project 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. Jakarta EE 9
最重要的一項變更可能是從 Java EE 遷移到 Jakarta EE 9,此時包命名空間從 javax. 變為 jakarta.。因此,我們每次使用 Java EE 類時,都需要在代碼中調整所有導入語句。
例如,在 Spring MVC 控制器中訪問 HttpServletRequest 對象時,我們需要替換為:
import javax.servlet.http.HttpServletRequest;<p>with:</p>
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 需要以下最小版本:
- Kotlin 1.7+
- Lombok 1.18.22+ (支持 JDK17)
- Gradle 7.3+
5. 關鍵要點
以下兩個主題受到了特別關注:原生可執行文件 和 可觀測性。 “Overarching” 表示:
- Spring 框架引入核心抽象
- 投資組合項目始終與之集成
- Spring Boot 提供自動配置
5.1. 本地可執行文件
構建本地可執行文件並將其部署到 GraalVM 優先級更高。因此,Spring Native 項目正在 逐步整合到 Spring 框架本身。
對於 AOT 生成,無需包含單獨的插件,我們可以直接使用 spring-boot-maven-plugin 中的一項 新目標:
// 這是一個示例代碼塊,用於説明註釋的翻譯
public class Example {
// This is a comment in the code.
public void myMethod() {
// This is another comment.
}
}
mvn spring-boot:aot-generate原生提示也將成為 Spring 核心的一部分。 此處的測試基礎設施將在里程碑 5(v6.0.0-M5)可用。
5.2. 可觀測性
Spring 6 引入了 Spring 可觀測性 – 一個基於 Micrometer 和 Micrometer Tracing (前身為 Spring Cloud Sleuth) 的新舉措。 其目標是利用 Micrometer 高效地記錄應用程序指標,並通過提供者(例如 OpenZipkin 和 OpenTelemetry)實現追蹤。
Spring Boot 3 中對這些功能都進行了自動配置,Spring 項目正在利用新的 Observation API 來自動實現自身 Instrumentation。
關於此項內容,可以參考專門的文章獲取更多詳情。
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 尚未發佈,我們可以嘗試使用當前的里程碑版本 Spring Boot 3.0.0-M4 Release Notes 以進行測試
8. 結論
正如我們所學到的,遷移到 Spring Boot 3 和 Spring 6 也意味着遷移到 Java 17 和 Jakarta EE 9。 如果我們高度重視可觀測性和原生可執行文件,那麼即將發佈的重大版本將為我們帶來最大的收益。