本文主要針對(duì) spring.profiles.active、spring.config.location 以及
spring.config.additional-location 的作用機(jī)制及優(yōu)先級(jí)問題進(jìn)行實(shí)踐對(duì)比。
本文案例工程已上傳 github 倉(cāng)庫(kù):
https://github.com/glmApper/springboot-series-guides/tree/master/guides-properties
spring.profiles.active
除了 application.properties 文件之外,profile-specific 配置也可以通過以下命名方式來定義:application-{profile}.properties。在沒有使用 active 指定 profiles 的情況下,Environment 會(huì)指定一組默認(rèn)的 profiles(默認(rèn)情況下是[default]),換句話說就是,如果沒有顯示的激活 profiles 配置文件,則默認(rèn)加載的是
application-default.properties 配置文件。
profile-specific 配置文件的屬性與標(biāo)準(zhǔn) application.properties 從相同的位置加載(一般是 classpath 下);profile-specific 指定的 properties 配置文件始終覆蓋默認(rèn)配置。
在案例工程中(guides-properties),resources 下面包括 application.properties 和
application-dev.properties 兩份配置文件
application.properties 文件配置
spring.application.name=appNameInnertestKey=key-default
application-dev.properties 文件配置
testKey=key-dev
通過以下代碼在啟動(dòng)時(shí)將配置值輸出:
@Value("${testKey}")private String testKey;@PostConstructprivate void init(){ System.out.println("-------------------------------"); System.out.println(testKey); System.out.println("-------------------------------");}復(fù)制代碼
不指定 spring.profiles.active 時(shí)
通過 JAVA -jar
guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,console 輸出如下:
2020-01-04 00:08:47.279 INFO 11050 --- [ main] com.glmapper.bridge.boot.BootStrap : No active profile set, falling back to default profiles: default-------------------------------key-default-------------------------------復(fù)制代碼
結(jié)論是,如果不顯示指定 profiles,則使用默認(rèn)的。
指定 spring.profiles.active 時(shí)
通過 java -jar -Dspring.profiles.active=dev
guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,console 輸出如下:
2020-01-04 00:08:14.426 INFO 11040 --- [ main] com.glmapper.bridge.boot.BootStrap : The following profiles are active: dev-------------------------------key-dev-------------------------------復(fù)制代碼
結(jié)論是,在顯示指定 profiles 的情況下,會(huì)覆蓋默認(rèn) application.properties 中的配置值。
spring.config.location
在 SpringBoot 2.x 中 spring.config.location 的語(yǔ)義發(fā)生了變更(此項(xiàng)配置會(huì)導(dǎo)致 classpath 中的 application.properties 不再生效)。原因如下:
private Set<String> getSearchLocations() { // spring.config.location 直接使用此份文件,不會(huì)再處理其他配置文件 if (this.environment.containsProperty(CONFIG_LOCATION_PROPERTY)) { return getSearchLocations(CONFIG_LOCATION_PROPERTY); } Set<String> locations = getSearchLocations(CONFIG_ADDITIONAL_LOCATION_PROPERTY); locations.addAll( asResolvedSet(ConfigFileApplicationListener.this.searchLocations, DEFAULT_SEARCH_LOCATIONS)); return locations;}復(fù)制代碼
在工程的根目錄的 conf 目錄下新建一個(gè)
application-conf.properties 配置文件,內(nèi)容如下:
testKey=key-spring.config.location復(fù)制代碼
通過 java -jar -Dspring.config.location=
conf/application-conf.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,發(fā)現(xiàn)啟動(dòng)報(bào)錯(cuò),原因是因?yàn)?nbsp;application-conf.properties 中沒有 配置 spring.application.name,而 spring.application.name 是在 resources 目錄下的 application.properties 中的,所以也間接說明前面提到的,會(huì)使 classpath 下的配置失效。新增 spring.application.name 之后,重新啟動(dòng)工程,
spring.application.name=guides-propertiestestKey=key-spring.config.location復(fù)制代碼
輸出結(jié)果如下:
2020-01-04 00:19:12.225 INFO 11147 --- [ main] com.glmapper.bridge.boot.BootStrap : No active profile set, falling back to default profiles: default-------------------------------key-spring.config.location-------------------------------復(fù)制代碼
所以在使用 spring.config.location 指定外部配置文件時(shí),需要此份配置文件需全量滿足當(dāng)前工程運(yùn)行時(shí)所需,因?yàn)樗粫?huì)去與 resources 目錄下的配置文件去做 merge 操作。
spring.config.additional-location
在使用
spring.config.additional-location 這種方式自定義 locations 時(shí),除了默認(rèn) locations 之外,還會(huì)使用 spring.config.additional-location 指定的。
additional-location:言外之意就是增量的配置
在工程的根目錄的 conf 目錄下新建一個(gè)
application-addition.properties 配置文件,內(nèi)容如下:
testKey=key-addition復(fù)制代碼
通過 java -jar
-Dspring.config.additional-location=conf/application-addition.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,輸出結(jié)果如下:
2020-01-04 00:28:30.048 INFO 11384 --- [ main] com.glmapper.bridge.boot.BootStrap : No active profile set, falling back to default profiles: default-------------------------------key-addition-------------------------------復(fù)制代碼
結(jié)論是,會(huì)覆蓋默認(rèn) application.properties 中的配置值。
spring.config.additional-location 與 spring.profiles.active 配置加載關(guān)系
spring.config.location 不用多數(shù),它就是獨(dú)立的一份,使用它就不能使用其它的。所以這里只分析
spring.config.additional-location 與 spring.profiles.active 配置加載關(guān)系。
同時(shí)指定兩個(gè)配置
通過 java -jar -Dspring.profiles.active=dev
-Dspring.config.additional-location=conf/application-addition.properties guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,輸出如下:
2020-01-04 00:32:59.044 INFO 11451 --- [ main] com.glmapper.bridge.boot.BootStrap : The following profiles are active: dev-------------------------------key-dev-------------------------------復(fù)制代碼
為了排除與 -D 參數(shù)順序有關(guān),也使用如下方式再執(zhí)行一次:java -jar
-Dspring.config.additional-location=conf/application-addition.properties -Dspring.profiles.active=dev guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar,輸出結(jié)果與前面相同,所以可以得出,spring.profiles.active 的優(yōu)先級(jí)比 spring.config.additional-location 要高。
`spring.config.additional-location` 指定差異增量配置
在
spring.config.additional-location 中增加 additionKey
testKey=key-additionadditionKey=testAddition
使用 java -jar
-Dspring.config.additional-location=conf/application-addition.properties -Dspring.profiles.active=dev guides-properties/target/guides-properties-0.0.1-SNAPSHOT.jar 啟動(dòng)工程,輸出如下:
2020-01-04 11:44:42.227 INFO 12821 --- [ main] com.glmapper.bridge.boot.BootStrap : The following profiles are active: dev-------------------------------key-devtestAddition-------------------------------復(fù)制代碼
結(jié)論是
spring.config.additional-location 可以用于提供出 profiles 機(jī)制或者默認(rèn)方式之外的增量配置。
小結(jié)
在使用外部化配置文件時(shí),執(zhí)行順序?yàn)椋?/p>
spring.config.location > spring.profiles.active >
spring.config.additional-location > 默認(rèn)的 application.proerties。
其中通過 spring.profiles.active 和
spring.config.additional-location指定的配置文件會(huì)與 默認(rèn)的application.proerties merge 作為最終的配置,spring.config.location 則不會(huì)。
作者:glmapper
鏈接:
https://juejin.im/post/5e10136d5188253aae7d828c