Spring Boot 3 和 Spring Framework 6.0 – 新增功能
一、概述
距離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。如果我們非常重視可觀察性和原生可執行文件,我們將從即將發布的主要版本中受益最多。
與往常一樣,所有代碼都可以在 GitHub 上找到。