2018年2月28日Spring Boot進入2.0時代,距今已經超過4年了。2022 年11月Spring Boot 3.0將正式發布,它將基於Spring Framework 6.0,並且需要 Java 17 或更高版本,同時它也將是Jakarta EE 9的第一個Spring Boot版本。還有六個月的時間留給開發者來過渡到Spring Boot 3.0,今天胖哥將告訴你一些方法,以便於將來快速遷移到3.0。
Java 17
Java 17將是繼Java 8以來最重要的LTS版本,是Java社區八年努力的成果。包含了很多重要的改進,Java 17也是目前性能最強的LTS版本。目前所有的Spring Boot 2.x 版本都能很好地適配Java 17,你可以無需等待,先着手JDK的升級調試,並嘗試一些新的特性和API。
儘快升級到Spring Boot 2.7
前幾日胖哥已經講了Spring Boot 2.7基本已經是Spring Boot 2.x最後一個大版本了,Spring Boot 2.5已經停止OSS支持,不再進行維護,Spring Boot 2.6也將在Spring Boot 3.0發布後停止維護,迭代的速度越來越快了。儘早升級到2.7才能更好遷移到3.0,這裡胖哥建議不要跳版本升級,比如不要直接從2.4跳到2.7,儘量按照2.4、2.5、2.6、2.7這樣的步驟升級,跨度太大反而不利於平滑升級。
移除過時代碼
每個Spring Boot版本都會或多或少有一些被標記為@Deprecated的代碼,Spring Boot 3.0 將完全移除在 2.x 過時的代碼,當然2.x早期的過時代碼也可能在最新的2.x被移除。儘量不要使用過時代碼,一般過時代碼上都注釋有過時的原因或者替代的API。
配置文件機制的更改
在Spring Boot 2.4中,配置文件application.properties和application.yaml的加載機制被改變,目的是為了簡化外部配置的加載方式,使之更加合理,帶來的是不向下兼容。為了平滑升級,Spring 提供了一個配置項來兼容舊機制:
spring:config:use-legacy-processing:true
而這個機制將在3.0時移除,我們必須使用符合新機制的配置方式,如果你存在這幾種方式就需要注意了。
多文檔Yaml
如果你在yaml配置文件中使用了間隔符---來聲明多文檔的話,你得知道現在按文檔聲明的順序來註冊聲明的配置屬性;而在 Spring Boot 2.3 及更早版本中,基於配置文件激活順序。舉個例子:
---spring:profiles:active:devapplication:name:dev-appserver:port:8081---spring:profiles:active:prodapplication:name:prod-appserver:port:8080
這個配置文件在Spring Boot 2.3以及更早的版本中會根據spring.profiles.active來決定加載的環境。但是從2.4開始後面的屬性會覆蓋前面的屬性。
外部配置總是覆蓋jar內的配置
如果你的配置文件在jar之外,並且該配置文件適用於特定的環境,例如application-dev.yaml。2.4以下的版本中,在jar外面的application.yaml不會覆蓋jar中的application-<profile名稱>.yaml文件,從2.4開始外部文件將總是覆蓋jar內的配置文件。你需要檢查你是否存在這種情況。
激活配置文件
如果您使用spring.profiles屬性來激活環境配置,那麼現在就應該遷移到spring.config.activate.on-profile。
舊玩法:
spring:profiles:"prod"secret:"production-password"
新玩法:
spring:config:activate:on-profile:"prod"secret:"production-password"
這真是折騰人啊。spring.profiles.active仍然可以用來激活特定的環境,例如命令行:
$java-jarmyapp.jar--spring.profiles.active=prod
你也可以在application.properties或application.yaml中使用spring.profiles.active,從2.4開始spring.profiles.active不能在特定環境中使用,也就是說application-<profile>.yaml中不能使用,---間隔的多文檔中也不能使用它。一句話,你不能再通過spring.profiles.active來合併一個包含了spring.config.activate.on-profile屬性的配置文件。
同樣的機制,spring.profiles.include屬性只能在非特定配置文件中使用,下面的配置是無效的:
#無效配置spring:config:activate:on-profile:"prod"profiles:include:"metrics"
更多的要點請參考官方配置文件Spring boot配置遷移指南[1]。
性能更高的路徑解析方式
從Spring Boot 2.6 開始,路徑解析默認使用PathPatternParser,取代了之前的Ant風格匹配AntPathMatcher,升級時很多人的Swagger出問題了,通過spring.mvc.pathmatch.matching-strategy解決了這個問題。雖然在Spring Boot 3.0中AntPathMatcher會繼續生效,但是PathPatternParser成為官方推薦,因為它的性能更高,稍後我也將出一篇專題來分析PathPatternParser。
兼容問題
首先是Jakarta EE 9的兼容問題,確保你的第三方依賴庫和你的代碼都兼容Jakarta EE 9。另外也要檢查Spring框架正在使用的第三方依賴jar是否有計劃兼容Spring 6。
嘗試去學習Spring 6
Spring 6以及Spring Boot 3已經發布了多個裡程碑,在閒暇時間可以抽出一些時間去嘗試一下,體驗新的特性和變化,評估你應用升級的難度。
參考資料 Spring boot配置遷移指南: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide
- EOF -
Spring Boot 2.7.0 發布,2.5 停止維護,節奏太快了吧
SpringCloud 優雅下線+灰度發布
看完本文有收穫?請轉發分享給更多人
關注「ImportNew」,提升Java技能
點讚和在看就是最大的支持❤️