SpringBoot配置文件優(yōu)先級用法及解讀
SpringBoot配置文件優(yōu)先級
SpringBoot官方文檔對配置文件優(yōu)先級有以下介紹,一共15種配置,從15到1為優(yōu)先級由高到低排列。
其中較為常用的如:11.命令行參數(shù)>5.系統(tǒng)環(huán)境變量>3.配置文件

其中3.配置文件按類型優(yōu)先級由高到低又依次是:
jar包外部指定的配置如外部的application-prod.properties/yaml
- >jar包外部普通配置文件如外部的application.properties/yaml
- >內(nèi)部指定配置文件 > 內(nèi)部普通配置文件

我們實際項目中經(jīng)常用高優(yōu)先級的配置來覆蓋低優(yōu)先級的配置,可以達到區(qū)分開發(fā)、測試、生產(chǎn)環(huán)境的效果:

其實以上的優(yōu)先級介紹并沒有覆蓋所有的配置文件類型和配置形式,譬如我們還可以在classpath的config目錄中放一個application.yaml,這個文件的優(yōu)先級應(yīng)該在哪個位置呢?
如果我們使用了如nacos這種配置中心,配置中心里的配置又應(yīng)該在以上優(yōu)先級的哪個位置呢?
我們可以從源碼的角度來簡單了解一下
SpringBoot對配置文件的優(yōu)先級控制。
我們項目中的各種配置在SpringBoot啟動時會被以各種方式讀取加載,雖然來源不同,但是所有的配置最終都會被保存在Environment對象的propertySources屬性中,如下圖:

來自各個地方的配置,最終都存在了這個List中,所以我們會得到一個有序的配置文件列表,其中每一個元素對應(yīng)一個配置文件。
這里注意一點,所謂的高優(yōu)先級覆蓋低優(yōu)先級這種說法是有歧義的,低優(yōu)先級的配置并不是被覆蓋了,而是也會原樣保存在這個List當(dāng)中,但是其位置會相對靠后。

然后我們很自然的就會想到,項目里獲取配置數(shù)據(jù)應(yīng)該有個通用的邏輯才對,就是順序遍歷這個List中的元素,按key查找,找到了就返回,找不到再繼續(xù)到下一個配置文件里找。
也就是如下代碼:

如果要向這個配置列表里加入配置也并不麻煩,可以參考如下代碼:
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(SB.class, args);
ConfigurableEnvironment environment = applicationContext.getEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
Map<String, Object> lastMap = new HashMap<>();
lastMap.put("testLast", "last");
propertySources.addLast(new MapPropertySource("lastMap", lastMap));
String last = environment.getProperty("testLast");
log.info("啟動成功!");
}所以其實一共有幾種類型的配置文件并不確定,我們可以自行增加,如果項目使用了配置中心,可以查看到其配置數(shù)據(jù)在List中的位置相對靠前,也就是為什么我們配置中心里的配置優(yōu)先級高于jar包中的配置。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解
這篇文章主要為大家介紹了ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
java實現(xiàn)簡易的學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細介紹了java實現(xiàn)簡易的學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Mybatis框架之工廠模式(Factory Pattern)
MyBatis中使用工廠模式來管理和創(chuàng)建SqlSession對象,從而簡化數(shù)據(jù)庫訪問的配置和管理過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
Java數(shù)據(jù)結(jié)構(gòu)之快速冪的實現(xiàn)
快速冪是用來解決求冪運算的高效方式。本文將詳細為大家介紹如何利用Java實現(xiàn)快速冪,以及利用快速冪求解冪運算問題,需要的可以參考一下2022-03-03
Spring配置shiro時自定義Realm中屬性無法使用注解注入的解決辦法
今天小編就為大家分享一篇關(guān)于Spring配置shiro時自定義Realm中屬性無法使用注解注入的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
解決springboot 實體類String轉(zhuǎn)Date類型的坑
這篇文章主要介紹了解決springboot 實體類String轉(zhuǎn)Date類型的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

