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

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

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

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

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

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

如果要向這個(gè)配置列表里加入配置也并不麻煩,可以參考如下代碼:
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("啟動(dòng)成功!");
}所以其實(shí)一共有幾種類型的配置文件并不確定,我們可以自行增加,如果項(xiàng)目使用了配置中心,可以查看到其配置數(shù)據(jù)在List中的位置相對(duì)靠前,也就是為什么我們配置中心里的配置優(yōu)先級(jí)高于jar包中的配置。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用@RequestBody 接收復(fù)雜實(shí)體類集合
這篇文章主要介紹了使用@RequestBody 接收復(fù)雜實(shí)體類集合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解
在某些應(yīng)用場(chǎng)景中需要大量的二維數(shù)組來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),但是二維數(shù)組中卻有著大量的無(wú)用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間2022-09-09
springboot 多環(huán)境配置 yml文件版的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot 多環(huán)境配置 yml文件版的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(63)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
使用okhttp替換Feign默認(rèn)Client的操作
這篇文章主要介紹了使用okhttp替換Feign默認(rèn)Client的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
Springboot?hibernate-validator?6.x快速校驗(yàn)示例代碼
這篇文章主要介紹了Springboot?hibernate-validator?6.x校驗(yàn),本文以6.2.1.Final版本為例解決了log4j版本的漏洞問(wèn)題,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12
詳解Java中字符串緩沖區(qū)StringBuffer類的使用
StringBuffer與String類似,只不過(guò)StringBuffer在進(jìn)行字符串處理時(shí)不生成新的對(duì)象,下面我們就來(lái)詳解Java中字符串緩沖區(qū)StringBuffer類的使用:2016-06-06

