国产精品夜色视频一级区_hh99m福利毛片_国产一区二区成人久久免费影院_伊人久久大香线蕉综合影院75_国产精品久久果冻传媒

您的位置:首頁 >聚焦 >

SpringBoot3正式版將于11月24日發(fā)布:都有哪些新特性?

2022-11-15 06:10:33    來源:程序員客棧

從 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 之后的一些重要改變。

record

record 是在 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)閱讀