導航:首頁 > 文件管理 > springcloud讀取配置文件順序

springcloud讀取配置文件順序

發布時間:2023-07-01 13:15:26

A. Spring Boot 配置的優先順序

本文主要參考 Externalized Configuration
為了能讓應用在不同的環境下運行,Spring Boot允許自定義配置文件,如properties文件、yaml文件、系統環境變數參數、命令行參數。配置文件的覆蓋優先順序如下

Developer Tools 提供了一些開發幫助工具,在build.gradle添加依賴後啟用。

Spring Boot會讀取在計算機用戶的home目錄下的 .spring-boot-devtools.properties 文件里的配置參數到該計算級的所有Spring Boot應用中作為頂層配置,岩頃顫如Linux環境下root用戶下 ~/.spring-boot-devtools.properties 文件。開發過程中,可以將一些個人參數記錄在這個配置文件中,例如ip地址,機器uuid,datasource參數等。在該配置文件中的定義的配置環境並不會影響到應用配置的讀取,官方原話是:

但要注意,該配置優先順序最高,設置的時候需要做好記錄否則會出現"原因不明的bug",不過應該很少人會用到這個功能。分析下源碼,就是加了一個配置切面,並把其設置為頂層配置:

在測試的時候,可能會使用另一套測試專用的配置,該套配置的優先順序高於系統環境變數、java系統參數、程序內部參數, @TestPropertySource 註解就是用來指定這一類配置的。該註解一共有5個參數可以設置:

如果使用註解的時候沒有任何參數,那麼會從標注了註解的測試類的包中嘗試讀取配置文件,例如測試類 com.spring.test.DemoTest ,那麼相應的默認配置文件為 com.spring.test.DemoTest.properties ,如果沒有找到默認的配置文件則乎慎拋出非法狀態異常。
在初始化上下文的時候會調用一個讀取、合並配置的方法 ,該方法通過工具類 TestPropertySourceUtils 讀取類的註解信息。 TestPropertySourceUtils 從類的註解解析配置信息後返回一個可合並的粗敗配置源。

@SpringBootTest 的value\properties屬性用於注入一些自定義的註解,語法要求和 @TestPropertySource 的properties一樣,這里就不詳細展開了。

用命令行方式啟動Spring Boot應用程序的時候,可以注入一些配置參數,參數的格式是 --key=name 。舉個簡單的例子,程序直接輸出一個參數,然後打成jar包後運行。

運行:
java -jar .\springbootconfiguraiton.jar --cl.name="Spring Boot Arguments"
從輸出的結果中可以看到可以讀取到命令行中的配置。

可以在環境變數中定義一個key為SPRING_APPLICATION_jsON的參數,值為json字元串,Spring Boot會解析該json字元串作為參數注入到系統中。SPRING_APPLICATION_JSON可以定義在環境變數、系統配置中,命令行也是可以的,例如命令行參數中用到的demo,執行以下的命令也應該能得到相同的參數結果。
java -jar .\springbootconfiguraiton.jar SPRING_APPLICATION_JSON='{"cl":{"name"="Spring Boot Arguments"}}'
結果輸出是undefined,不知道原因,這個配置方式用的應該也很少,放棄研究。。。

優先順序是 ServletConfig > ServletContext ,可以在application.yml中設置:

隨機數配置大多用於測試,支持的類型如下:

其中long\int可以限制數據范圍,[]是閉區間,()是開區間。

這個應該是我們用的最多的。首先說優先順序,文件可以放在以下4個位置,相同文件從上到下覆蓋。外部指的是啟動應用程序的目錄,例如gradle用application插件打包後,運行的腳本目錄就是 ./ :

文件的命名為 application-[當前激活的環境名].[yml/properties] ,當前激活的配置可以用 spring.profile.active=[當前激活的環境名] 定義,多個環境名用逗號分隔,未設置時用 default 標識。關於如果修改默認的載入路徑和文件名,後面會繼續討論。

Spring Boot系統啟動時默認會讀取的配置文件,支持properties\yml格式。也就是說,會先載入 application.properties ,根據 spring.profile.active 的設置載入相應的 application-XX.properties 配置,然後按優先順序合並配置文件。
不同文件目錄下application.properties的優先順序和 自定義配置文件 的順序是一樣的。

類似 @TestPropertySource註解 ,在項目中可以方便的注入自定義的配置文件,註解一共有5個參數:

B. Spring Boot 第二彈,配置文件詳解-史上最全

  Spring Boot 官方 提供了兩種常用的配置文件格式,分別是 properties 、 YML 格式。相比於 properties 來說, YML 更加年輕,層級也是更加分明。 強烈推薦使用 YML 格式

  Spring Boot項目 啟動會掃描以下位置的 application.properties 或者 application.yml 作為默認的配置文件.

徒手撕源碼

內部類Loader的load方法

getSearchLocations()方法

asResolvedSet()

下面給出優先順序 從高到低 的配置文件排列順序:

以設置應用埠為例 初體驗Spring Boot配置文件

properties後綴結尾(application.properties)

yml/yaml後綴結尾(application.yml/application.yaml)

數字,字元串,布爾,日期

對象、Map

數組

數字,字元串,布爾,日期

對象、Map

數組

@ConfigurationProperties(prefix = "person")詳解

標注在類上

標注在方法上

綜上所述

  @ConfigurationProperties 註解能夠輕松的讓配置文件跟實體類綁定在一起。

 值得關注的是: @ConfigurationProperties 這個註解僅僅是支持從 Spring Boot的默認配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我們如何從自定義配置文件取值呢???

 別著急,有解決辦法,那就是再加一個註解: @PropertySource(value = "classpath:custom-profile.properties") ,下面會有對 @PropertySource 註解的介紹。請耐心往下面看。

使用@PropertySource註解

對應配置文件

創建兩個配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。

我們可以通過控制變數法進行測試,具體過程我這里就不贅述了。

直接說 結論 吧: Spring載入順序 為 從左到右順序載入 ,後載入的會 覆蓋 先載入的屬性值。

另外需要注意的是 : @PropertySource 默認載入 xxx.properties類型 的配置文件,不能載入 YML格式 的配置文件。如何解決呢?下面來解決這一問題

對應配置文件:

編寫PropertiesController

擴展功能

application.yml 主配置文件

application-dev.yml 開發配置文件

application-prod.yml 生產配置文件

application-test.yml 測試配置文件

(1)主配置文件:配置激活選項

(2)其他配置文件:指定屬於哪個環境(同yml,只不過表現形式是 key=value 的,三個配置文件分別是: application-dev.properties , application-prod.properties , application-test.properties )

 無論是使用上述 多文檔塊 的方式,還是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。

感謝閱讀小生文章。祝大家早日富可敵國,實現財富自由。

寫文不易 ,一定要 點贊、評論、收藏哦 , 感謝感謝感謝!!!

C. springboot配置文件總結

springboot 本身支持多種靈活的配置方式,為開發 springboot 程序帶來了很大的靈活性和擴展性,但是同時由於太靈活,經常會導致明明配置了相關屬性,卻沒有生效。
本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。

springboot 配置文件支持靈活的路徑,以及靈活的文件名,用一個變數表達式總結如下:

部分源碼如下:

當滿足上述變數表達式的配置文件有多個時,會有一個配置的優先順序。假設

上面每個條件組合起來,則最多有配置文件如下,且順序從上到下:

獲取屬性時,按從上到下的順序遍歷由上述文件生成的屬性資源對象 PropertySource ,如果遇到匹配的key直接返回。
總結一下:就是如果同一個key的屬性只出現一次,則直接取該值即可。如果同一個key的屬性出現多次,則取順序靠前的屬性資源對象。另外其中每個文件都是可選的。

需要注意的一點是:如果在同一個 location 下配置了多個文件名一樣的文件,則只會取一個,比如在 classpath:/ ,有如下兩個文件 application.yml :

則只會根據 classloader 的 classpath 列表,選取第一個出現的文件。因為 springboot 載入配置文件時最底層是使用的下面的方法:

這兩個方法只會獲取 classloader 類的 ucp 屬性裡面第一個匹配到的值。如果對 springboot 自身的機制不滿意,想獲取所有的classpath:/路徑下面的 applicaiton.yml 文件,可以使用下面的方法:

本文總結了 springboot 配置文件的原理以及多個配置文件生效的順序。如果存在增加了配置文件或者在配置文件裡面增加了屬性卻沒有生效,可以參考上面的 springboot 配置文件表達式和配置文件生效順序進行排查。

後面還會有一篇文章討論基於 springboot 配置原理如何實現自定義的配置讀取方式。

D. springboot載入properties和yml配置文件的順序

假設一個項目在同一位置同時存帶讓在application.properties和application.yml文件,

且其中都含有相同的某個key,但value不同,如:山行伏

application.properties中:server.port=8001,

application.yml中:server.port=8888。

問題:springboot是否都載入這兩個配置文件?如果兩個文件有相同的key,取哪一個文件的value?

答: 都載入,且按properties→yml的順序載入。

在看到spring.factories中,配置載入器順序是先執行再到YamlPropertySourceLoader。

在ConfigFileApplicationListener獲取server.port這個key的value時候,可以發現兩配置文件全都載入進去了,且注意順序,application.properties文件在前。

getSource()方法獲取到兩個Source,先從application.properties文件中查找值,一旦找到立逗攜即返回,如果找不到再從application.yml中查找。

E. Springboot 讀取配置文件原理

Springboot 讀取配置文件(application.yaml, application.properties)的過程發生在SpringApplication#prepareEnvironment() 階段,而prepareEnvironment又屬於整個Springboot 應用啟動的非常前置階段,因為Environment的准備是後續bean創建的基礎。讓我們來一探啟動是的詳細code。除去StopWatch這些code,可以發現prepareEnvironment 發生在SpringApplication#run 這在整個應用啟動的多步實質性操作中幾乎是第一步。

而prepareEnvironment中最重要的是通過觸發listener(EventPublishingRunListener)來通過#multicastEvent發出。

而#multicastEvent的實現其實也很簡單,找到相關的監聽的listener,然後一個個的調用他們的Listener#onApplicationEvent(event)方法,而這其中就包括了處理configuration文件的listener。
在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,在2.4.0之後,處理configuration 文件的lister是,並且對configuration文件的載入做了較大的改變,導致一些行為可能出現了變化,這也就是下面要詳細講的內容。

Springboot 2.4.0之後,configuration 文件的load順序按照優先順序是如下順序(序號大的會被小的覆蓋):

和之前版本比較,整體的屬性載入順序並無調整,只有Application properties(14,15)這里有順序的調整,具體調整為:

如果存在多個active的profiles,例如[Test, Dev], 那麼對於同時存在兩個profile 配置文件中的配置,後面的profile里的配置(Dev)會覆蓋前面profile(Test)里配置的值。

前面講了這么多,終於要引出Springboot 2.4之後配置文件載入的行為變化了。

考慮這樣的情況,如果我想在跑Springboot test的時候指定特定的profile,那麼可以在Test class中加入@ActiveProfile("Test")。 如果我的應用中存在的某個自定義listener中,會根據當前environment 設置profile,如env.addActiveProfile("Dev")。
當前就會有兩個active profile,由於springboot-test會在調用application#run 前利用DefaultActiveProfilesResolver把@ActiveProfile註解定義的profile(Test)先加入了active的profile,等test run的時候 env.addActiveProfile("Dev") 又會把"Dev"也作為active profile 加入,這時候當前的active profile便為["Test", "Dev"]。

據上面介紹,後面的profile(Dev)對應的configuration 會覆蓋前面的(Test)。可Springboot 2.4.0之前的版本為我們做了調整,讓Test class中@ActiveProfile內定義的profile所對應的配置文件成為最高優先順序。

剛才提到在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,我們
來看看ConfigFileApplicationListener的相關code。

查看initializeProfiles(),發現此時對profile的順序做了調整,將activatedViaProperty (Test) 放在最後add,於是profile的順序就變成了[Dev, Test]。

在profiles.poll()時原本profile的順序已經倒了過來,已經變為[Dev, Test], 在load()方法中由於後置的Test profile,application-Test.yaml中的值最終生效了。

可是到了Springboot2.4.0之後,ConfigFileApplicationListener被deprecated了,取而代之的是,通過調用來完成configuration載入。
.java

.java

只是老老實實的set了active profile,並沒有調換profile的順序。最後調用定義在spring.factories中的resource loader class來load 配置文件。

YamlPropertySourceLoader.java

插一句,Springboot為我們提供了很好的yaml文件parse的code,當你需要解析yaml文件時不妨直接參考Springboot的YamlPropertySourceLoader

這樣一旦應用升級到Springboot 2.4.0之後相同的test code會使用application-Dev.yaml中配置的值,造成了test結果的改變。
如果要解決這個問題,根據上面介紹的配置文件優先順序順序,可以在@SpringbootTest中設置properties 來作為最終的配置覆蓋當前profile對應的配置。

了解一個框架很不容易,一個小小的變化都有可能造成應用的行為變化,唯有刨根問底,不斷總結才是framework人解決一切問題的不變的方法論。

F. SpringBoot配置文件存放位置以及讀取順序

默認情況下,我們可以將application.properties或者application.yaml(為了方便演示,本文以下均以application.properties介紹)放置在如下四處:

1.1、idea中,為了我們本地方便開發測試,我們在此處創建一個config目錄,然後把application.properties放進去,項目正常運行。

jar包會自動生成在target目錄下。

我們將生成的jar包,復制出來,到另外文件夾進行運行,比如,我現在該jar包復制到test目錄下,但是這個時候是起不來,因為沒有配置文件,雖然我們在idea裡面是有config目錄的,但是它並不沒有被打包進去。我們要把config目錄也復制過來,跟該jar包放在同一個目錄下。

在此處,我們可以使用java -jar demo-0.01-SNAPSHOT來運行項目。

正常運行。

當我們將其打成jar包時,application.properties同樣不會被打包進jar包中。需要另外復制出來和jar包放在才能正常運行。

推薦以上兩種方式來放置配置文件,如果不寫開發,測試,和生產好幾套環境配置文件的話,就可以直接打開配置文件,改成自己需要的配置即可。

以下兩種方式是將該配置文件打包在jar包裡面了,即便只改一個埠號,開發人員先改配置文件,再打包,再運行。此處也記錄下,並解開jar包,看下該配置文件被打包後,放置的位置。

打包後,如下圖,jar包再target裡面,我們尋找下application.properties文件。為了方便演示,我們將target目錄下的demo-0.0.1-SNAPSHOT.jar放到一個新目錄給它解壓開,找下該配置文件,我放置到了一個test目錄下。

解壓後:如下圖,我們進入目錄

發現config目錄被放置在classes目錄下。然後這也就讓我們明白了,什麼是classpath?classpath的路徑到底指的是哪裡,在idea中我們就把它放置在resource目錄,該目錄就是表示classpath。而被打成jar包後classes目錄就是所謂的classpath。

所有的yaml文件,同理。

G. Spring載入多個配置文件載入順序是怎麼樣的

雖然分為多個文件,不過他們在內存里仍然只是一個文件

所以是同時載入到內存的

閱讀全文

與springcloud讀取配置文件順序相關的資料

熱點內容
如何打開ps保存的文件 瀏覽:744
幼兒編程教育有哪些 瀏覽:453
汽車發外地用什麼app 瀏覽:810
網路如何贊美女人漂亮 瀏覽:143
如何把桌面文件放到excel裡面 瀏覽:363
照片文件名是怎麼查的 瀏覽:876
c怎麼在cmd模式下顯示文件 瀏覽:325
手機怎麼把文件夾的圖片移到相冊 瀏覽:440
hjc是啥文件的格式 瀏覽:298
報廢鐵皮文件櫃圖片 瀏覽:801
win10系統更新文件能 瀏覽:558
怎麼讓蘋果手機下載其他APP 瀏覽:471
多個cs文件編譯成一個dll 瀏覽:606
sql管理工具70 瀏覽:130
js裡面的圖片對齊 瀏覽:965
三星2016視頻文件夾 瀏覽:317
舊手機創新手機數據怎麼傳 瀏覽:954
怎麼刪除領克app里的記錄 瀏覽:254
捷波朗弦月3最新版本 瀏覽:123
win10保存不了文件 瀏覽:735

友情鏈接