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