環境:Springboot2.4.10
當應用程序啟動時,Spring Boot將自動從以下位置查找并加載Application.properties和application.yaml文件:
- 從Classpath類路徑classpath的根類路徑classpath下的/config包
- 從當前目錄當前目錄當前目錄中的/config子目錄/config子目錄的直接子目錄
列表按優先級排序(較低項的值優先于較早項)。加載文件中的文檔作為PropertySources添加到Spring環境中。
上面的加載順序是倒著的。
- 修改加載的配置文件名稱
默認是加載的以application的配置文件,可以通過spring.config.name啟動參數進行修改:
JAVA -jar myproject.jar --spring.config.name=myproject
- 修改配置文件路徑
使用spring.config.location屬性顯式指定位置。此屬性接受以逗號分隔的列表,其中包含一個或多個要檢查的位置。
java -jar myproject.jar --spring.config.location=optional:classpath:/default.properties,optional:classpath:/override.properties
這里的optional前綴的意思是:
如果位置是可選的,并且您不介意它們是否不存在。簡單說就是這些路徑下的文件是可選的。
- 配置文件位置
如果spring.config.location包含目錄(與文件相反),則它們應以/結尾。在運行時,它們將在加載之前附加從spring.config.name生成的名稱。直接導入spring.config.location中指定的文件。
1.1 可選位置
默認情況下,當指定的配置數據位置不存在時,Spring Boot將拋出
ConfigDataLocationNotFoundException,應用程序將不會啟動。
如果要指定一個位置,但不介意它是否總是存在,則可以使用optional:作為前綴 。你可以將此前綴與spring.config.location和
spring.config.additional-location屬性以及spring.config.import聲明一起使用。
例如,spring.config.import值
optional:file:./myconfig.properties允許啟動應用程序,即使myconfig.properties文件丟失。
如果要忽略所有
ConfigDataLocationNotFoundException并始終繼續啟動應用程序,可以使用
spring.config.on-not-found屬性。使用
SpringApplication.setDefaultProperties(...)或使用系統/環境變量。
1.2 通配符位置
如果配置文件位置包含最后一個路徑段的*字符,則將其視為通配符位置。在加載配置時,通配符會展開,以便同時檢查直接子目錄。在Kubernetes這樣的環境中,當存在多個配置屬性源時,通配符位置特別有用。
例如,如果你有一些redis配置和一些MySQL配置,你可能希望將這兩個配置分開,同時要求它們都存在于application.properties文件中。這可能會導致兩個單獨的application.properties文件裝載在不同的位置,例如
/config/redis/application.properties和/config/mysql/application.properties。在這種情況下,如果通配符位置為config/*/,將導致處理這兩個文件。
默認情況下,Spring Boot在默認搜索位置包含config/*/。這意味著將搜索jar之外的/config目錄的所有子目錄。
您可以將通配符位置與spring.config.location和
spring.config.additional-location屬性一起使用。
1.3 特定配置文件
除了應用程序屬性文件外,Spring Boot還將嘗試使用命名約定應用程序{profile}加載特定于概要文件的文件。例如,如果應用程序激活名為prod的概要文件并使用YAML文件,則將同時考慮application.yml和application-prod.yml。
特定于配置文件的屬性從與標準application.properties相同的位置加載,特定于配置文件的文件始終覆蓋非特定文件。如果指定了多個配置文件,則應用最后一個wins策略。例如,如果prod、live(即順序為:prod, live)配置文件由spring.profiles.active屬性指定,則
application-prod.properties中的值可以被application-live.properties中的值覆蓋。
1.4 導入其它數據
應用程序屬性可以使用spring.config.import屬性從其他位置導入更多配置數據。導入會在發現時進行處理,并被視為插入聲明導入的文檔下方的附加文檔。
例如:
spring:
config:
import:
- optional:classpath./config/cfg.yml
這里的optional表示可選的,即導入的文件可以不存在;
看如下情況:
cfg.yml配置文件內容
cfg:
name: classpath:/config
spring:
config:
import:
- optional:classpath:/config/cfg.yml
---
cfg:
name: a1
這里的a1會覆蓋import中的值
cfg:
name: a1
---
spring:
config:
import:
- optional:classpath:/config/cfg.yml
這里cfg.yml配置的值會覆蓋a1值
可以在單個spring.config.import鍵下指定多個位置。位置將按照其定義的順序進行處理,以后的導入將優先。
注意:官方文檔說上面的兩種順序配置,產生的是同樣的效果,但是我這測試的后面的會替換前面的。
1.5 導入無擴展名文件
某些云平臺無法向卷裝載的文件添加文件擴展名。要導入這些無擴展文件,您需要給Spring Boot一個提示,以便它知道如何加載它們。可以通過將擴展提示放在方括號中來實現這一點。
例如,假設你有一個/etc/config/myconfig文件,希望將其作為yaml導入。您可以使用以下命令從application.properties導入它:
spring:
config:
import: "file:/etc/config/myconfig[.yaml]"
完畢!!!