SpringBoot約定了配置文件,默認(rèn)為 application.properties,通過(guò)該文件可以修改很多默認(rèn)的配置,當(dāng)然我們還可以在該配置文件內(nèi)添加自定義的配置,該文件通過(guò) key=value的形式進(jìn)行配置。1疑惑配置提示?...
SpringBoot約定了配置文件,默認(rèn)為 application.properties,通過(guò)該文件可以修改很多默認(rèn)的配置,當(dāng)然我們還可以在該配置文件內(nèi)添加自定義的配置,該文件通過(guò) key=value的形式進(jìn)行配置。
1
疑惑配置提示?
當(dāng)我們使用開(kāi)發(fā)工具來(lái)配置時(shí),就會(huì)出現(xiàn)相應(yīng)的提示,這要完全要?dú)w功于 spring-configuration-metadata.json配置元數(shù)據(jù)文件,該文件內(nèi)記錄了配置的名稱、類型、歸屬類等信息,如果配置類型為 枚舉還可以實(shí)現(xiàn) 選擇性配置。
SpringBoot提供了一個(gè)依賴,它的主要任務(wù)就是自動(dòng)生成配置元數(shù)據(jù),該依賴的名稱為 spring-boot-configuration-processor,在打包時(shí)會(huì)在 META-INF目錄生成一個(gè)名為 spring-configuration-metadata.json的文件。
2
配置方式
雖然默認(rèn)使用 properties格式的配置文件,不過(guò)這種方式會(huì)導(dǎo)致配置的部分前綴冗余,可閱讀性稍差, SpringBoot內(nèi)部還支持使用 yaml方式的配置文件,只需要在 src/main/resources目錄下創(chuàng)建一個(gè)名為 application.yml文件即可,使用配置時(shí)同樣也有提供功能。
項(xiàng)目?jī)?nèi)可以同時(shí)存在 application.properties、 application.yml兩個(gè)文件,經(jīng)過(guò)測(cè)試發(fā)現(xiàn), properties優(yōu)先級(jí)會(huì)高一些,相同名稱的配置,會(huì)將 yml內(nèi)的配置覆蓋掉。
3
指定配置文件
如果你的應(yīng)用程序配置文件的名稱不是 application,你想要進(jìn)行自定義,可以通過(guò) --spring.config.name命令行參數(shù)進(jìn)行指定,如下所示:
java
-
jar project
-
sample
.
jar
--
spring
.
config
.
name
=
custome
注意事項(xiàng):我們只需要指定配置文件的名稱即可,可以使用 properties或 yaml文件格式,上面的配置會(huì)加載 src/main/resources/custome.yml或 src/main/resources/custome.properties。
通過(guò) --spring.config.name僅僅是修改了配置文件的名稱,那如果是修改配置文件所處的目錄位置,我們需要怎么做呢?
SpringBoot已經(jīng)給我們準(zhǔn)備好了,通過(guò) --spring.config.location參數(shù)就可以指定配置文件的位置,如下所示:
java
-
jar project
-
sample
.
jar
--
spring
.
config
.
location
=
classpath
:/
configs
/
custome
.
yml
如果一個(gè)配置文件無(wú)法滿足你的需求,那你看看下面這個(gè)方式:
java
-
jar project
-
sample
.
jar
--
spring
.
config
.
location
=
classpath
:/
configs
/
custome
.
yml
,
classpath
:/
configs
/
default
.
properties
注意事項(xiàng):支持通過(guò)命令行參數(shù)的方式指定多個(gè)配置文件,使用英文半角 , 隔開(kāi)即可。
如果你通過(guò) spring.config.location指定的不是一個(gè)文件而是一個(gè)目錄,在路徑最后務(wù)必添加一個(gè)"/"結(jié)束,然后結(jié)合 spring.config.name進(jìn)行組合配置文件,組合示例如下:
# 加載/configs/application.properties 或 /configs/application.yml(默認(rèn)文件名)
java
-
jar project
-
sample
.
jar
--
spring
.
config
.
location
=
classpath
:/
configs
/
# 加載/configs/custome.properties 或 /configs/custome.yml
java
-
jar project
-
sample
.
jar
--
spring
.
config
.
location
=
classpath
:/
configs
/
--
spring
.
config
.
name
=
custome
注意事項(xiàng): spring.config.name該配置參數(shù)默認(rèn)值為 application,所以如果只是指定了 spring.config.location并為目錄形式,上面示例中會(huì)自動(dòng)將 spring.config.name追加到目錄路徑后,如果指定的 spring.config.location并非是一個(gè)目錄,這里會(huì)忽略 spring.config.name的值。
4
加載順序
SpringBoot應(yīng)用程序在啟動(dòng)時(shí)會(huì)遵循下面的順序進(jìn)行加載配置文件:
1. 類路徑下的配置文件
2. 類路徑內(nèi)config子目錄的配置文件
3. 當(dāng)前項(xiàng)目根目錄下的配置文件
4. 當(dāng)前項(xiàng)目根目錄下config子目錄的配置文件
示例項(xiàng)目配置文件存放結(jié)構(gòu)如下所示:
.
project
-
sample
├──
config
│
├──
application
.
yml
(
4
)
│
└──
src
/
main
/
resources
|
│
├──
application
.
yml
(
1
)
|
│
└──
config
|
|
│
├──
application
.
yml
(
2
)
├──
application
.
yml
(
3
)
啟動(dòng)時(shí)加載配置文件順序:1 > 2 > 3 > 4
src/main/resources下的配置文件在項(xiàng)目編譯時(shí),會(huì)放在 target/classes下。
5
優(yōu)先級(jí)覆蓋
SpringBoot配置文件存在一個(gè)特性,優(yōu)先級(jí)較高的配置加載順序比較靠后, 相同名稱的配置 優(yōu)先級(jí)較高的會(huì) 覆蓋掉 優(yōu)先級(jí)較低的內(nèi)容。
為了更好地解釋這一點(diǎn),我們根據(jù)對(duì)應(yīng)的加載順序分別創(chuàng)建一個(gè) application.yml配置文件,來(lái)驗(yàn)證根據(jù)優(yōu)先級(jí)的不同是否存在覆蓋問(wèn)題,如下圖所示:
在上面四個(gè)配置文件中都有一個(gè)名為 name的配置,而紅色字體標(biāo)注的內(nèi)容就是每個(gè)配置文件 name的配置內(nèi)容,下面我們來(lái)啟動(dòng)項(xiàng)目測(cè)試下輸出內(nèi)容。
6
運(yùn)行測(cè)試
在測(cè)試之前我們讓啟動(dòng)類實(shí)現(xiàn) CommandLineRunner接口,如下所示:
@SpringBootApplication
public
class
LoadOrderOfConfigFilesApplication
implements
CommandLineRunner
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
LoadOrderOfConfigFilesApplication
.
class
,
args
);
}
@Value
(
"${name}"
)
private
String
name
;
@Override
public
void
run
(
String
...
args
)
throws
Exception
{
System
.
out
.
println
(
"配置名稱:"
+
name
);
}
}
項(xiàng)目啟動(dòng)后通過(guò) run方法進(jìn)行打印 ${name}配置的內(nèi)容。
測(cè)試一:順序覆蓋
保留上面四個(gè)對(duì)應(yīng)加載順序的配置文件,啟動(dòng)項(xiàng)目,控制臺(tái)輸出內(nèi)容:
配置名稱:
project
/
config
期望與實(shí)際輸出是符合的,項(xiàng)目根下的 config目錄是 最后加載的,所以它的 優(yōu)先級(jí)相對(duì)其他三個(gè)來(lái)說(shuō)是 最高的,覆蓋順序?yàn)椋? > 3 > 2 > 1。
測(cè)試二:跨順序覆蓋
上一個(gè)測(cè)試點(diǎn)我們對(duì)每一個(gè)加載順序都對(duì)應(yīng)添加了一個(gè)配置文件,那如果我們只有兩個(gè) project/config、 classes/config兩個(gè)目錄的配置文件,是否按照優(yōu)先級(jí)進(jìn)行覆蓋呢?
刪除另外兩個(gè),只保留 project/config、 classes/config兩個(gè)位置的配置文件,啟動(dòng)項(xiàng)目控制臺(tái)輸出如下所示:
配置名稱:
project
/
config
同樣是輸出了優(yōu)先級(jí)最高的 project/config配置文件的內(nèi)容,覆蓋順序?yàn)椋? > 1
測(cè)試三:?jiǎn)雾樞蚣虞d
平時(shí)在項(xiàng)目開(kāi)發(fā)中一般都是將 application.yml配置文件放在 src/main/resources目錄下,然而根據(jù)上面的加載順序來(lái)看,我們可以將配置文件放置在任意一處,啟動(dòng)時(shí)都會(huì)進(jìn)行加載。
僅保留 classes/config位置的配置文件,啟動(dòng)項(xiàng)目控制臺(tái)輸出內(nèi)容如下所示:
配置名稱:
classes
/
config
IDEA對(duì) SpringBoot的支持真的很強(qiáng)大, classes/config下的配置文件同樣提供了 關(guān)鍵字提醒功能。
7
總結(jié)
了解配置文件的加載順序,才能得心應(yīng)手的進(jìn)行配置覆蓋,完全控制在不同環(huán)境下使用不同的配置內(nèi)容,要記住 classes/application.yml優(yōu)先級(jí)最低, project/config/application.yml優(yōu)先級(jí)最高。
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)