SpringBoot3正式版將于11月24日發(fā)布:都有哪些新特性?
從 2018 年 2 月 28 號發(fā)布 Spring Boot 2.0 版本開始,整個(gè) 2.X 版本已經(jīng)經(jīng)過了 4 年多的時(shí)間,累計(jì)發(fā)布了 95 個(gè)不同的版本,而就在前不久,2.X 系列的也已經(jīng)迎來了他的最終版本:2.7。
前幾天我還寫了一篇關(guān)于 Spring Boot 從 2.1 版本升級到 2.7 的文章,而現(xiàn)在,Spring Boot 3.0 也要來了!
時(shí)間就定在本月的 24 號,Spring Boot 將要發(fā)布 3.0 的最終 RELEASE 版本。
(相關(guān)資料圖)
截止到現(xiàn)在為止,Spring Boot3已經(jīng)發(fā)布了 6 個(gè)版本,累計(jì) 5 個(gè)里程碑版本,2 個(gè) RC 候選版,現(xiàn)在就跟著我一起看下 Spring Boot 3.0 將會要哪些重大的變化。
JAVA 17對于我們比較關(guān)注的第一個(gè)最重要的事情就是,Spring Boot3 版本最低支持 Java17,還在萬年 Java8 的同學(xué),該升級就升級了吧,這里介紹一下關(guān)于 Java17 之后的一些重要改變。
recordrecord 是在 Java14中引入的,https://openjdk.org/jeps/395 。
以前我們寫一個(gè)類需要寫一堆 get、set 方法,后來有了lombok之后這些都省了,現(xiàn)在 Java 給我們提供了原生的寫法。
publicrecordUser(){}
本質(zhì)上 record 修飾之后的類就是一個(gè) final 類,而且他的父類不是 Object,也不是余某軍,而是java.lang.Record。
record 類屬性只能聲明在頭部,所有的成員變量都是 public final 的,而且只能聲明靜態(tài)屬性,但是可以聲明成員方法和靜態(tài)方法。
publicrecordUser(Stringusername){staticintid;publicStringgetName(){returnthis.username;}}text blocks
text blocks 文本塊是在 Java13 引入的,并且在 Java15 版本成為永久特性,https://openjdk.org/jeps/378。
以前我們復(fù)制一個(gè)多行的字符串到 Java 里,會自動(dòng)加上行終止符。
Stringsql="SELECT\n"+"\t*\n"+"FROM\n"+"\tsys_user0\n"+"WHERE\n"+"\tuser_name="abc"";
而有了文本塊的功能之后,可以幫助我們更方便的定義包含多行文本的字符串字面量,他使用三引號作為開始和結(jié)束的分隔符。
StringsqlBlock="""SELECT*FROMsys_user0WHEREuser_name="abc"""";switch表達(dá)式
switch表達(dá)式是在 Java12 中引入的,在 Java14 成為永久特性,https://openjdk.org/jeps/361。
升級后的 switch 其實(shí)包含兩個(gè)特性,一個(gè)是允許 case 使用多個(gè)常量,另外一個(gè)就是有返回值。
新增case x->語法,使用方面更加簡潔,而且不需要再每個(gè) case 寫一個(gè) break了。
Stringname="xiao";intret=switch(name){case"ai"->1;case"xiao","xian"->2;default->0;};Pattern Matching 模式匹配
模式匹配可以幫助我們簡化instanceof代碼。
if(objinstanceofStrings){System.out.println(s.toLowerCase());}
還可以在 switch-case 語句使用:
staticdoublegetDoubleUsingSwitch(Objecto){returnswitch(o){caseIntegeri->i.doubleValue();caseFloatf->f.doubleValue();caseStrings->Double.parseDouble(s);default->0d;};}sealed 密封類
sealed 在 Java15中引入,在 Java17成為永久特性。
sealed 密封類的主要作用就是限制類的繼承。
比如我們有 Animal類,Dog 和 Cat 分別繼承它,實(shí)現(xiàn)了 eat 方法,他們吃的動(dòng)作是不一樣的,但是我們不希望人能繼承 Animal,不允許他去繼承動(dòng)物吃的行為,就可以像下面這樣通過 sealed 和 permits 關(guān)鍵字限制它是一個(gè)密封類,只有貓和狗能夠繼承它。
需要注意,父類被定義為 sealed 之后,子類必須是 sealed、 non-sealed 或者 final。
publicabstractsealedclassAnimalpermitsCat,Dog{publicabstractvoideat();}publicnon-sealedclassDogextendsAnimal{@Overridepublicvoideat(){System.out.println("dogeat");}}publicnon-sealedclassCatextendsAnimal{@Overridepublicvoideat(){System.out.println("cateat");}}Jakarta EE 9
另外一個(gè)很重要的變化就是本次升級之后,最低只支持 Jakarta EE 9,使用 Servlet5.0 和 JPA3.0 規(guī)范,不過最新版本RC2已經(jīng)升級到了 JakartaEE 10,默認(rèn)使用 Servlet6.0 和 JPA3.1 規(guī)范。
有些同學(xué)可能連 Jakarta 是什么都不知道,這個(gè)英文單詞是印尼首都雅加達(dá)的意思,其實(shí)就是我們知道的 JavaEE 改名之后就叫 JakartaEE,比如我們之前的javax.servlet包現(xiàn)在就叫jakarta.servlet。
也因此,代碼中所有使用到比如HttpServletRequest對象的 import 都需要修改。
importjavax.servlet.http.HttpServletRequest;改為importjakarta.servlet.http.HttpServletRequest;Spring Native
Spring Native 也是升級的一個(gè)重大特性,支持使用 GraalVM 將 Spring 的應(yīng)用程序編譯成本地可執(zhí)行的鏡像文件,可以顯著提升啟動(dòng)速度、峰值性能以及減少內(nèi)存使用。
我們傳統(tǒng)的應(yīng)用都是編譯成字節(jié)碼,然后通過 JVM 解釋并最終編譯成機(jī)器碼來運(yùn)行,而 Spring Native 則是通過 AOT 提前編譯為機(jī)器碼,在運(yùn)行時(shí)直接靜態(tài)編譯成可執(zhí)行文件,不依賴 JVM。
關(guān)于 AOT 技術(shù),在我之前寫過的文章中有提及到:這樣優(yōu)化Spring Boot,啟動(dòng)速度快到飛起!。
演示這里我簡單演示一下怎么使用,首先我們需要做一些準(zhǔn)備工作:
1.https://www.graalvm.org/downloads/ 下載GraalVM,指定JAVA_HOME,export JAVA_HOME=/Users/user/Desktop/graalvm-ce-java17-22.3.0/Contents/Home
2.下載個(gè)新一點(diǎn)的 IDEA,比如我使用的是最新的 EAP 版本
3.下載個(gè)新一點(diǎn)的 JDK,比如使用 JDK17
然后通過 Spring Initialzr 創(chuàng)建一個(gè)新項(xiàng)目,使用最新版本Spring Boot 3.0.0-SNAPSHOT,勾選GraalVM Native Support,創(chuàng)建好項(xiàng)目之后添加一個(gè)測試的Controller。
@RestControllerpublicclassTestController{@GetMapping("/")publicStringhello(){return"GraalVM...";}}
然后直接運(yùn)行程序,發(fā)現(xiàn)啟動(dòng)時(shí)間花費(fèi)了大概 1 秒。
然后執(zhí)行命令,生成鏡像文件:
./gradlewnativeCompile
這個(gè)過程挺耗時(shí)的,花了大概 2 分多鐘才生成好。
最后執(zhí)行命令:
./build/native/nativeCompile/demo2
我們看到,最終啟動(dòng)時(shí)間是 0.082 秒,快了 10 多倍。
這里我使用的是 gradle,如果使用 maven 的話,使用如下的命令:
1.mvnw-Pnativenative:compile2../target/demo2其他依賴升級
Spring Boot 3 最低依賴 Spring6 版本,因此對應(yīng)的 Spring 版本也該換了(不會有人還在用 Spring2 的吧),其他的依賴升級如下:
?Kotlin 1.7+
?Lombok 1.18.22+ (JDK17 support支持版本)
?Gradle 7.3+
另外我想說的是,SpringBoot2.7引入了新的自動(dòng)裝配方式META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,原來的寫法spring.factories在 3.0 版本以下還能兼容,3.0 新版本之后,老的寫法spring.factories不能使用了,中間件相關(guān)的開發(fā)同學(xué)要注意了。
其他一些關(guān)于配置的變化,Spring MVC 的一些小變化就不說了,更新日志到時(shí)候都可以看到。
最后,如果想升級的話,在新版本發(fā)布之后,會有一個(gè)基于Spring Boot 2.7 版本的遷移指南。
參考:
1.https://www.baeldung.com/spring-boot-3-spring-6-new
2.https://blogs.oracle.com/java/post/go-native-with-spring-boot-3-and-graalvm
3.https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0
4.https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes
往期推薦
我服了!SpringBoot升級后這服務(wù)我一個(gè)星期都沒跑起來?。ㄉ希?/p>
NB的Github項(xiàng)目,看到最后一個(gè)我驚呆了!
抖音用戶的文化程度到底什么水平?
我攤牌了!真正的灰度隊(duì)列實(shí)現(xiàn)方案!全網(wǎng)你都搜不到!
因?yàn)橐黄恼?,發(fā)生了一大堆好玩的事兒!
10分鐘教你寫一個(gè)數(shù)據(jù)庫
可惡,又是個(gè)線上問題!
驗(yàn)證一個(gè)小小的問題
關(guān)鍵詞: 啟動(dòng)時(shí)間 模式匹配 使用的是
相關(guān)閱讀
-
世界熱推薦:今晚7:00直播丨下一個(gè)突破...
今晚19:00,Cocos視頻號直播馬上點(diǎn)擊【預(yù)約】啦↓↓↓在運(yùn)營了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場,每周都會有相當(dāng)多項(xiàng)目起起伏伏。在過去... -
環(huán)球今亮點(diǎn)!頭條觀察 | DeFi的興衰與...
在比特幣得到機(jī)構(gòu)關(guān)注之后,許多財(cái)務(wù)專家預(yù)測世界將因?yàn)榧用茇泿诺?.. -
重新審視合作,體育Crypto的可靠關(guān)系才能雙贏
Block-987即使在體育Crypto領(lǐng)域,人們的目光仍然集中在FTX上。隨著... -
簡訊:前端單元測試,更進(jìn)一步
前端測試@2022如果從2014年Jest的第一個(gè)版本發(fā)布開始計(jì)算,前端開發(fā)... -
焦點(diǎn)熱訊:劉強(qiáng)東這波操作秀
近日,劉強(qiáng)東發(fā)布京東全員信,信中提到:自2023年1月1日起,逐步為...