亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談SpringBoot2.4 配置文件加載機(jī)制大變化

 更新時(shí)間:2020年08月23日 17:12:27   作者:冷冷zz  
這篇文章主要介紹了淺談SpringBoot2.4 配置文件加載機(jī)制大變化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

Spring Boot 2.4.0.M2剛剛發(fā)布,它對(duì) application.properties 和 application.yml 文件的加載方式進(jìn)行重構(gòu)。如果應(yīng)用程序僅使用單個(gè) application.properties 或 application.yml 作為配置文件,那么可能感受不到任何區(qū)別。但是如果您的應(yīng)用程序使用更復(fù)雜的配置(例如,Spring Cloud 配置中心等),則需要來(lái)了解更改的內(nèi)容以及原因。

為什么要進(jìn)行這些更改

隨著最新版本 Spring Boot 發(fā)布,Spring 一直在努力提升對(duì) Kubernetes 的原生支持。在 Spring Boot 2.3 中,官方增加 Kubernetes Volume 的配置支持,但是未能實(shí)現(xiàn)。

Volume 配置掛載是 Kubernetes 的一項(xiàng)常用功能,其中 ConfigMap 指令用于直接在文件系統(tǒng)上顯示配置。您可以裝載包含多個(gè)鍵和值合并的完整 YAML 文件,也可以使用更簡(jiǎn)單的目錄樹(shù)格式,其中文件名是鍵,文件內(nèi)容是值。

希望同時(shí)提供兩者的支持,并且能夠兼容我們現(xiàn)有的 application.properties 和 application.yml 。為此需要修改 ConfigFileApplicationListener 類(lèi)。

ConfigFileApplicationListener 問(wèn)題

在 Spring Boot 中配置文件加載類(lèi) ConfigFileApplicationListener 屬于比較核心的底層代碼,每次維護(hù)都是非常的困難。并不是因?yàn)榇a編寫(xiě)錯(cuò)誤或者缺少相關(guān)單元測(cè)試,而是在添加新功能時(shí),很難解決之前存在的問(wèn)題。
即:

  • 配置文件非常靈活,可以在當(dāng)前文件啟用其他配置文件。
  • 文檔加載順序不固定。

以下面的例子來(lái)說(shuō):

security.user.password: usera
---
spring.profiles: local
security.user.password: userb
runlocal: true
---
spring.profiles: !dev
spring.profiles.include: local
security.user.password: userc

在這里,我們有一個(gè) 多文檔 YAML文件(一個(gè)文件由三個(gè)邏輯文檔組成,由 --- 分隔)。

如果使用 --spring.profile.actives=prod 運(yùn)行,那么 security.user.password 的值是什么?是否設(shè)置 runlocal 屬性?中間部分文檔是否包括在內(nèi),因?yàn)榕渲梦募谔幚頃r(shí)沒(méi)有激活?

我們經(jīng)常會(huì)遇到關(guān)于這個(gè)文件處理邏輯的問(wèn)題,但是每當(dāng)試圖修復(fù)它們時(shí),最后帶來(lái)各種各樣的負(fù)面問(wèn)題。

因此,在 Spring boot 2.4 中對(duì) Properties 和 YAML 文件的加載方式進(jìn)行兩個(gè)重大更改:

  1. 文檔將按定義的順序加載。
  2. profiles 激活開(kāi)關(guān)不能被配置在特定環(huán)境中。

文檔排序

從 Spring Boot 2.4 開(kāi)始,加載 Properties 和 YAML 文件時(shí)候會(huì)遵循, 在文檔中聲明排序靠前的屬性將被靠后的屬性覆蓋 。

這點(diǎn)與 .properties 的排序規(guī)則相同。我們可以想一想,每次將一個(gè) Value 放入 Map ,具有相同 key 的新值放入時(shí),將替換已經(jīng)存在的 Value。

同理對(duì) Multi-document 的 YAML 文件,較低的排序也將被較高的覆蓋:

test: "value"
---
test: "overridden-value"

Properties 文件支持多文檔屬性

在 Spring Boot 2.4 中, Properties 支持類(lèi)似 YAML 多文檔功能。多文檔屬性文件使用注釋?zhuān)?# )后跟三個(gè)(---)破折號(hào)來(lái)分隔文檔( 選擇使用注釋?zhuān)允宫F(xiàn)有的 IDE 正常支持 )。

例如,上面的 YAML 等效的 properties 為:

test=value
#---
test=overridden-value

特定環(huán)境激活配置

上述示例實(shí)際上沒(méi)有任何意義,在我們開(kāi)發(fā)過(guò)程中更為常見(jiàn)是聲明某個(gè)屬性?xún)H在特定環(huán)境生效激活。

在 Spring Boot 2.3 中可以配置 spring.profiles 來(lái)實(shí)現(xiàn)。但在 Spring Boot 2.4 中 屬性更改 為 spring.config.activate.on-profile 。

例如,我們想要 test 屬性?xún)H僅在 dev Profile 激活時(shí)覆蓋它,則可以使用以下配置:

test=value
#---
spring.config.activate.on-profile=dev
test=overridden-value

Profile Activation

使用 spring.profiles.active 屬性在 application.properties 或 application.yaml 文件的 根配置文件 來(lái)激 相關(guān)環(huán)境文件。
例如,下面這樣:

test=value
spring.profiles.active=local
#---
spring.config.activate.on-profile=dev
test=overridden value

不允許的是將 spring.profiles.active 屬性與 spring.config.activate.on-profile 一起使用。例如,以下文件將引發(fā)異常:

test=value
#---
spring.config.activate.on-profile=dev
spring.profiles.active=local # will fail
test=overridden value

通過(guò)這一新限制能使 application.properties 和 application.yml 文件更加容易理解。使得 Spring Boot 本身更易于管理和維護(hù)。

Profile Groups

Profile Groups 是 Spring Boot 2.4 中的一項(xiàng)新功能,可讓您將單個(gè)配置文件擴(kuò)展為多個(gè)子配置文件。例如,假設(shè)有一組復(fù)雜的 @Configuration 類(lèi),可以使用 @Profile 注釋有條件地啟用它們。使用 @Profile("proddb") 開(kāi)啟數(shù)據(jù)庫(kù)配置,使用 @Profile("prodmq") 開(kāi)啟消息配置等等。

使用多個(gè)配置文件可以使我們的代碼更易于理解,但是對(duì)于部署而言并不是理想的選擇。若用戶(hù)需要同時(shí)激活 proddb , prodmq , prodmetrics 等。那么 Profile Groups 可讓您做到這一點(diǎn)。

您可以在 application.properties 或 application.yml 文件中定義 spring.profiles.group,那么開(kāi)啟 prod 則就相當(dāng)于激活了此組的全部環(huán)境 。例如:

spring.profiles.group.prod=proddb,prodmq,prodmetrics

Importing 擴(kuò)展 Configuration

現(xiàn)在,我們已經(jīng)解決了配置文件處理的基本問(wèn)題,我們終于能夠考慮我們想要提供的新功能。我們使用 Spring Boot 2.4 提供的主要功能是支持導(dǎo)入其他配置。

對(duì)于早期版本的 Spring Boot,很難在 application.properties 和 application.yml 之外導(dǎo)入其他 properties 或 yaml 文件??梢允褂?spring.config.additional-location 屬性但它可以處理的文件類(lèi)型非常有限。

在 Spring Boot 2.4 可以直接在 application.properties 或 application.yml 文件中使用新的 spring.config.import 屬性。例如希望導(dǎo)入一個(gè) "忽略的 git" 的 developer.properties 文件,以便團(tuán)隊(duì)中的任何開(kāi)發(fā)人員都可以快速更改屬性:

application.name=myapp
spring.config.import=developer.properties

甚至可以將 spring.config.import 與 spring.config.activate.on-profile 結(jié)合起來(lái)使用。例如,這里 prod.properties 僅在 prod 配置文件處于激活狀態(tài)時(shí)加載:

spring.config.activate.on-profile=prod
spring.config.import=prod.properties

Import 可以被視為在聲明它們的文檔下方插入的其他文檔。它們 遵循與常規(guī)多文檔文件相同的自上而下的順序:導(dǎo)入僅被導(dǎo)入一次,無(wú)論聲明了多少次。

volume 掛載配置

導(dǎo)入定義使用與 URL 一樣語(yǔ)法作為其值。如果您的位置沒(méi)有前綴,則它被視為常規(guī)文件或文件夾。但是,如果您使用 configtree: 前綴,則告訴 Spring Boot,您將期望在該位置使用 Kubernetes volume 裝載的配置樹(shù)。

例如,您可以在 application.properties 配置:

spring.config.import=configtree:/etc/config

如果您有以下裝載的內(nèi)容:

etc/
 +- config/
     +- my/
     |  +- application
     +- test

將在 Spring Environment 中擁有 my.application 和 test 屬性。 my.application 的值是 /etc/config/my/application 的內(nèi)容, test 的值是 /etc/config/test 的內(nèi)容。

根據(jù)云平臺(tái)類(lèi)型激活

如果只希望 Volume 掛載的配置(或該內(nèi)容的任何屬性)在特 定的云平臺(tái)上 處于激活狀態(tài),可以使用 spring.config.activate.on-cloud-platform 屬性。它的工作方式與 spring.config.activate.on-profile 類(lèi)似,但它使用 CloudPlatform 的值,而不是配置文件名稱(chēng)。

如果我們想要在部署到 Kubernetes 時(shí)啟用上述配置樹(shù),我們可以執(zhí)行以下操作:

spring.config.activate.on-cloud-platform=kubernetes
spring.config.import=configtree:/etc/config

支持其他位置

spring.config.import 屬性中指定的位置字符串是完全可插拔的,可以通過(guò)編寫(xiě)幾個(gè)自定義類(lèi)來(lái)擴(kuò)展,第三方庫(kù)將對(duì)自定義位置提供支持。例如,你能想到的第三方 jar 文件,例如 archaius://… , vault://… 或 zookeeper://… 。

如果您有興趣添加其他位置支持,請(qǐng)查看 org.springframework.boot.context.config 包 ConfigDataLocationResolver 和 ConfigDataLoader 的 javadoc。

版本回滾

正如上文所描述的,Spring Boot 針對(duì)配置文件的功能變更是非常大的??紤]到低版本的兼容性

可以設(shè)置 spring.config.use-legacy-processing=true 屬性即可,恢復(fù)到之前版本的文件處理機(jī)制。

如果發(fā)現(xiàn)關(guān)于此處的問(wèn)題,則需要切換到舊版處理,請(qǐng) 在 GitHub 上提出問(wèn)題,官方將嘗試解決該問(wèn)題。

總結(jié)

官方希望新的配置數(shù)據(jù)處理更加好用,并且不會(huì)引起太多升級(jí)麻煩。如果您想了解更多有關(guān)它們的信息,可以查閱更新的 參考文檔。 

到此這篇關(guān)于淺談SpringBoot2.4 配置文件加載機(jī)制大變化的文章就介紹到這了,更多相關(guān)SpringBoot2.4 文件加載機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java如何獲取客戶(hù)端mac地址

    Java如何獲取客戶(hù)端mac地址

    在用戶(hù)登錄時(shí),通過(guò)獲取IP地址來(lái)識(shí)別計(jì)算機(jī)的MAC地址,然后將用戶(hù)賬號(hào)與該MAC地址進(jìn)行綁定,確保每個(gè)賬號(hào)只能在一臺(tái)特定的計(jì)算機(jī)上登錄,增強(qiáng)系統(tǒng)安全性,這種方法適用于需要嚴(yán)格賬戶(hù)安全管理的場(chǎng)景
    2024-09-09
  • SpringBoot集成elasticsearch使用圖文詳解

    SpringBoot集成elasticsearch使用圖文詳解

    Spring Boot集成Elasticsearch其實(shí)非常簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于SpringBoot集成elasticsearch使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • InputStreamReader和BufferedReader用法及實(shí)例講解

    InputStreamReader和BufferedReader用法及實(shí)例講解

    這篇文章主要介紹了InputStreamReader和BufferedReader用法及實(shí)例講解的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 出現(xiàn)次數(shù)超過(guò)一半(50%)的數(shù)

    出現(xiàn)次數(shù)超過(guò)一半(50%)的數(shù)

    給出n個(gè)數(shù),需要我們找出出現(xiàn)次數(shù)超過(guò)一半的數(shù),下面小編給大家分享下我的實(shí)現(xiàn)思路及關(guān)鍵代碼,感興趣的朋友一起學(xué)習(xí)吧
    2016-07-07
  • 詳解Java中Hibernate的基本原理

    詳解Java中Hibernate的基本原理

    持久化是將程序數(shù)據(jù)在持久狀態(tài)和瞬時(shí)狀態(tài)間轉(zhuǎn)換的機(jī)制。JDBC就是一種持久化機(jī)制。文件IO也是一種持久化機(jī)制。下面通過(guò)本文給大家介紹Java中Hibernate的基本原理,需要的朋友參考下吧
    2017-09-09
  • Java SpringMVC的自定義異常類(lèi)

    Java SpringMVC的自定義異常類(lèi)

    這篇文章主要為大家詳細(xì)介紹了SpringMVC的自定義異常類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java文件復(fù)制多種方法實(shí)例代碼

    Java文件復(fù)制多種方法實(shí)例代碼

    近期用到文件復(fù)制,雖然程序很簡(jiǎn)單,因?yàn)闀r(shí)間久了淡忘了,所以寫(xiě)一篇文章記錄一下,下面這篇文章主要給大家介紹了關(guān)于Java文件復(fù)制多種方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法

    JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法

    本篇文章主要介紹了JAVA 根據(jù)設(shè)置的概率生成隨機(jī)數(shù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Springboot詳細(xì)講解循環(huán)依賴(lài)

    Springboot詳細(xì)講解循環(huán)依賴(lài)

    最近在使用Springboot做項(xiàng)目的時(shí)候,遇到了一個(gè)循環(huán)依賴(lài)的問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于springboot循環(huán)依賴(lài)實(shí)現(xiàn)以及分析的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java如何通過(guò)Socket同時(shí)發(fā)送文本和文件

    Java如何通過(guò)Socket同時(shí)發(fā)送文本和文件

    這篇文章主要介紹了Java如何通過(guò)Socket同時(shí)發(fā)送文本和文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論