Spring Boot 2.4.0 釋出,配置檔案重大調整,不要亂升級!!
阿新 • • 發佈:2020-12-03
前段時間 [Spring Boot 2.4.0](https://mp.weixin.qq.com/s/Fff2EsSxraefIUJ8HpQXFg) 釋出了,棧長作了一個新特性全盤解讀,其中介紹了一個很重要的變革,那就是配置檔案。
配置檔案可是每個框架的核心,不得不搞清楚,所以,這篇棧長就帶大家深入實戰了解下 Spring Boot 2.4 配置檔案都有哪些具體變更,以及如何遷移,已助你決定是否遷移到 Spring Boot 2.4。
## 概要
Spring Boot 2.4 改進了處理 application.properties 和 application.yml 配置檔案的方式。更新後的邏輯旨在簡化和合理化外部配置的載入方式,但有些引數的組合形式卻得到了限制,升級請謹慎。
如果你的應用工程只有一個簡單的 application.properties 或 application.yml 檔案,則可以進行無縫升級到 Spring Boot 2.4.0。
但是,如果你的配置較為複雜,比如說有指定 profile 的引數,或者有基於 profile 啟用的引數,要使用新功能就需要進行一些更改。
更多細節可參考:
> https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide
## 變更細節
#### 1、YAML 配置排序變更
如果你在 application.yml 配置中啟用了多套配置(即用 --- 分隔的多套配置),那就需要注意了,因為在 Spring Boot 2.4 中,配置引數是按在配置檔案中定義的順序先後進行載入的,因為在 Spring Boot 2.3 及之前的版本中,各個配置引數是基於 "profile" 的啟用的順序來載入的,後面啟用載入的引數會覆蓋之前的。
如果你有一些配置引數,它們之間又是互相覆蓋,那就要確保所需要的引數要放在檔案最後。
如在 Spring Boot 2.3 中:
```
spring:
profiles:
active:
- prod
- prodmq
- proddb
---
spring:
profiles: prod
env: prod
---
spring:
profiles: proddb
env: proddb
---
spring:
profiles: prodmq
env: prodmq
```
Spring Boot 基礎構建及 profile 基本介紹這裡就不介紹了,關注公眾號Java技術棧回覆關鍵字 "boot",可以閱讀我寫的幾十篇往期實戰文章。
Spring Boot 教程和示例程式碼已上傳到 Github:
> https://github.com/javastacks/spring-boot-best-practice
回到上面的配置,如果同時啟用多個 profile 的話,後面的會覆蓋前面的,即 proddb 裡面的配置引數會覆蓋 prodmq 的,所以 env 的值為:proddb。
而如果升級到了 Spring Boot 2.4,env 的值則為:prodmq,因為按順序載入的話 prodmq 中的 env 在配置檔案中最下方。
所以,如果升級到 Spring Boot 2.4,就需要檢查 "profile" 這些配置引數之間的關係,可能還需要對 YAML 中的配置重新排序。
#### 2、Profile 配置覆蓋變更
如果你使用了 JAR 外部化配置,並且也使用了基於 "profile" 的特定配置檔案,那你就要檢查下配置是否按預期載入了。
因為在之前的版本中,JAR 包外部的 application.properties 配置檔案不會覆蓋 JAR 包裡面的基於 "profile" 的 application-xxxprofile.properties 配置檔案。
從 Spring Boot 2.4 開始,外部化配置引數會覆蓋內部的配置引數(不管是否基於 "profile" 啟用),這個也是修復 Spring Boot 上的的一個 Issue:
> https://github.com/spring-projects/spring-boot/issues/3845
這個問題的就是指 JAR 包外部的應用程式引數應優先於 JAR 包內部的特定啟用的配置引數。
#### 3、Profile 配置引數變更
如果你使用了 `spring.profiles` 屬性指定了多套 YMAL 配置檔案,現在需要使用新引數替代:
> spring.config.activate.on-profile
配置示例:
```
---
spring.config.activate.on-profile: dev
env: dev
server:
port: 8080
---
spring.config.activate.on-profile: test
env: test
server:
port: 8081
---
spring.config.activate.on-profile: prod
env: prod
server:
port: 8082
---
spring.config.activate.on-profile: proddb
db:
name: mysql
env: proddb
---
spring.config.activate.on-profile: prodmq
mq:
address: localhost
env: prodmq
```
和之前的邏輯一樣,可以繼續使用 `spring.profiles.active` 來啟用特定的 profiles 列表,或者也可以使用表示式啟用,如:prod & cloud,但是不能和 `spring.config.activate.on-profile` 結合使用。
另外,如果你之前使用了 `spring.profiles.include` 和 `spring.profiles` 結合使用,就需要使用新的 "**profile group**" 特性了。
配置 profile group 組示例:
```
spring:
profiles:
active:
- prodall
group:
prodall:
- prod
- prodmq
- proddb
```
這樣就定義了一個 "prodall" 組,包含了 prod, proddb, prodmq 三個 profile,同時在配置檔案中直接使用 `spring.profiles.active` 來啟用 "prodall" 組,這樣就同時激活了 prod, proddb, prodmq。
#### 4、迴歸傳統模式
如果你想繼續使用 Spring Boot 2.3 的配置檔案邏輯,或者還沒準備好遷移到 Spring Boot 2.4,也可以通過在 application.properties 或者 application.yml 配置檔案中新增以下引數回到傳統模式:
> spring.config.use-legacy-processing = true
如果不指定這個引數為:true,那麼在 Spring Boot 2.4 中就是預設新的配置檔案處理邏輯。
## 總結
總結下來,個人感覺某些變更著實沒什麼卵用,但也不得不跟上它的節奏。
所以大家一定要注意了,遷移到 Spring Boot 2.4,需要注意文中的配置變更細節,一定要對所有變更內容做調整,不然引數載入會受到影響。
本節所有實戰原始碼示例已上傳至 Github:
> https://github.com/javastacks/spring-boot-best-practice
好了,今天的分享就到這裡了,單看官方文件還不是很清楚,棧長也是對配置升級的細節做了各個實踐才明白其中的奧妙,希望對大家有幫助。
歡迎大家 Star 關注,後續會不斷更新。
學習更多 Spring Boot 教程,請關注公眾號Java技術棧,後面棧長還會繼續推送一些 Spring Boot 2.4 新特性實戰文章。在公眾號後臺回覆:boot,歷史 Spring Boot 教程我也都整理好了。
最後,別忘了點在看、轉發哦,需要你的鼓勵~
> 版權申明:本文系公眾號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重他人勞動成果和智慧財產權。
**近期熱文推薦:**
1.[Java 15 正式釋出, 14 個新特性,重新整理你的認知!!](http://www.javastack.cn/article/2020/java15-released/)
2.[終於靠開源專案弄到 IntelliJ IDEA 啟用碼了,真香!](http://www.javastack.cn/article/2020/intellij-idea-by-open-source-project/)
3.[我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看。。](http://www.javastack.cn/article/2020/java-8-optional-map-do-you-know/)
4.[吊打 Tomcat ,Undertow 效能很炸!!](http://www.javastack.cn/article/2020/undertow-introduce-with-spring-boot/)
5.[《Java開發手冊(嵩山版)》最新發布,速速下載!](http://www.javastack.cn/article/2020/alibaba-release-java-develop-rules-songshan/)
覺得不錯,別忘了隨手點贊+轉