正式發(fā)布
Spring Framework 6.0 首個(gè) RC 版本正式發(fā)布,可以開始使用了。


新特性
我們一起來(lái)看看這次6.0版本帶來(lái)了哪些特性?需要注意的是該版本整個(gè)框架代碼庫(kù)現(xiàn)在基于 Java 17 源代碼級(jí)別,所以如果你想使用需要升級(jí)版本到 JDK 17+ 才可以,并且底層依賴的 J2EE 也遷移到了Jakarta EE 9(至少 Tomcat 10 / Jetty 11,為了與 Jakarta EE 9 兼容)
Spring 官方認(rèn)為 JDK11 僅僅是一個(gè)過(guò)渡使用的 JDK 版本,而 JDK17 幾乎是一個(gè)全新的編程語(yǔ)言,增強(qiáng)和完善了 API 和 JVM,這讓升級(jí) JDK17 成為更具吸引力的選擇。
主要內(nèi)容
主要更新內(nèi)容如下:
- 為 AOT 引擎設(shè)置引入 builder API
- 支持Spring 應(yīng)用程序探索虛擬線程,基于 JDK19
- 基于 GraalVM 將 Spring 應(yīng)用程序編譯成原生鏡像(native image)
- 將 javax.servlet 遷移到 jakarta.servlet,兼容最新的 web 服務(wù)器如:Tomcat 10.1、Jetty 11、Undertow 2.3,最新的持久性框架 Hibernate ORM 5.6.x
- 。。。
接下來(lái)重點(diǎn)深入介紹幾點(diǎn)影響重大的新功能!
AOT編譯
Ahead-Of-Time,即預(yù)先編譯,與我們熟知的Just-In-Time(JIT,即時(shí)編譯)來(lái)說(shuō) AOT 帶來(lái)的好處是 JVM 可以直接加載這些已經(jīng)預(yù)編譯成二進(jìn)制碼的類信息,可以直接調(diào)用,而無(wú)需再將其運(yùn)行時(shí)編譯成二進(jìn)制碼。因?yàn)?AOT 不占用運(yùn)行時(shí)間,可以做一些較耗時(shí)的優(yōu)化,從而顯著的加快程序的啟動(dòng)。避免在程序運(yùn)行時(shí)的編譯性能消耗和內(nèi)存消耗,可以在程序運(yùn)行初期就達(dá)到最高性能。
AOT 的方式可以減少 JIT 帶來(lái)的預(yù)熱時(shí)間,減少 Java 應(yīng)用長(zhǎng)期給人帶來(lái)的“第一次運(yùn)行慢”感覺。
AOT的引入,意味著Spring生態(tài)正式引入了提前編譯技術(shù),相比于JIT編譯,AOT有助于優(yōu)化Spring框架啟動(dòng)慢、占用內(nèi)存多、以及垃圾無(wú)法被回收等問題。
Spring Native
在新版本中引入了Spring Native,有了Spring Native ,Spring可以不再依賴Java虛擬機(jī),而是基于 GraalVM 將 Spring 應(yīng)用程序編譯成原生鏡像(native image),提供了一種新的方式來(lái)部署 Spring 應(yīng)用,這種部署 Spring 的方式是云原生友好的。
Spring Native的優(yōu)點(diǎn)是編譯出來(lái)的原生 Spring 應(yīng)用可以作為一個(gè)獨(dú)立的可執(zhí)行文件進(jìn)行部署,而不需要安裝JVM,而且啟動(dòng)時(shí)間非常短并且消耗更少的資源,它的缺點(diǎn)就是構(gòu)建時(shí)長(zhǎng)要比JVM更長(zhǎng)一些。
Spring Framework 6.0.x 原生鏡像支持的 GraalVM 版本是基于 JDK 17-19 的 GraalVM 22.3。請(qǐng)注意,截至 2023 年,GraalVM 與 OpenJDK 發(fā)布模型保持一致,每個(gè)新的 GraalVM 版本僅支持最新的 Java 級(jí)別。因此,Spring Framework 6.x 功能版本可能需要在未來(lái)需要具有更高 JDK 基線的新 GraalVM 版本,例如基于 JDK 21 作為下一個(gè) LTS。
虛擬線程
眾所周知當(dāng)前Java線程的實(shí)現(xiàn)是每個(gè)Java線程需要消耗一個(gè)操作系統(tǒng)線程。而操作系統(tǒng)線程這種資源是非常稀缺,非常寶貴的。而虛擬線程是java.lang.Thread一種用戶態(tài)的實(shí)現(xiàn),當(dāng)我們?cè)谔摂M線程上使用同步API時(shí),是不會(huì)阻塞任何操作系統(tǒng)線程,硬件利用率接近最佳。
JDK19 正式引入虛擬線程,意味著許多虛擬線程可以在同一個(gè)操作系統(tǒng)線程上運(yùn)行它們的 Java 代碼,從而有效地共享它。值得一提的是,它能做到在幾個(gè)G的JVM堆上創(chuàng)建幾百萬(wàn)個(gè)活動(dòng)的虛擬線程(這在現(xiàn)在的JDK中幾乎不可能實(shí)現(xiàn)),并且表現(xiàn)出和現(xiàn)在的線程幾乎一樣的行為。這些協(xié)程由 JVM 管理,因此它們也不會(huì)增加額外的上下文切換開銷,因?yàn)樗鼈冏鳛槠胀?Java 對(duì)象存儲(chǔ)在 RAM 中。
總結(jié)
除了以上重大變更外,詳細(xì)變更可以去官網(wǎng)查看:What's New in Spring Framework 6.x

Spring 將 Spring 6.0 稱為下一個(gè)十年的新開端,直接舍棄了以往版本的 JDK,強(qiáng)制升級(jí)到 JDK 17及以上。而目前國(guó)內(nèi)市場(chǎng)上大部分公司還在使用 JDK 8,新應(yīng)用你會(huì)使用 Spring 6.0 嘛?