是時候為Spring Boot 3.0做準備了

碼農小胖哥發表於2022-06-01

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.propertiesapplication.yaml 的載入機制被改變,目的是為了簡化外部配置的載入方式,使之更加合理,帶來的是不向下相容。為了平滑升級,Spring 提供了一個配置項來相容舊機制:

spring:
  config:
    use-legacy-processing: true

而這個機制將在3.0時移除,我們必須使用符合新機制的配置方式,如果你存在這幾種方式就需要注意了。

多文件Yaml

如果你在yaml配置檔案中使用了間隔符---來宣告多文件的話,你得知道現在按文件宣告的順序來註冊宣告的配置屬性;而在 Spring Boot 2.3 及更早版本中,基於配置檔案啟用順序。 舉個例子:

---
spring:
  profiles: 
    active: dev
  application:
    name: dev-app
server:
  port: 8081      
---
spring:
  profiles:
    active: prod
  application:
    name: prod-app
server:
  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 -jar myapp.jar --spring.profiles.active=prod

你也可以在 application.propertiesapplication.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配置遷移指南

效能更高的路徑解析方式

從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已經發布了多個里程碑,在閒暇時間可以抽出一些時間去嘗試一下,體驗新的特性和變化,評估你應用升級的難度。

關注公眾號:Felordcn 獲取更多資訊

個人部落格:https://felord.cn

相關文章