天天看點

Spring Boot 2.4.0 釋出,配置檔案重大調整,不要亂更新!!

前段時間 Spring Boot 2.4.0 釋出了,棧長作了一個新特性全盤解讀,其中介紹了一個很重要的變革,那就是配置檔案。

配置檔案可是每個架構的核心,不得不搞清楚,是以,這篇棧長就帶大家深入實戰了解下 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:

好了,今天的分享就到這裡了,單看官方文檔還不是很清楚,棧長也是對配置更新的細節做了各個實踐才明白其中的奧妙,希望對大家有幫助。

歡迎大家 Star 關注,後續會不斷更新。

學習更多 Spring Boot 教程,請關注公衆号Java技術棧,後面棧長還會繼續推送一些 Spring Boot 2.4 新特性實戰文章。在公衆号背景回複:boot,曆史 Spring Boot 教程我也都整理好了。

最後,别忘了點在看、轉發哦,需要你的鼓勵~