Spring Boot啟動會掃描以下位置的application.properties或者application.yml文件作為Spring Boot的默認配置文件
外部配置的加載順序官網 說明
SpringApplication
loads properties from application.properties
files in the following locations and adds them to the Spring Environment
:
-
A
/config
subdirectory of the current directory -
The current directory
-
A classpath
/config
package -
The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
讀取位置就是:
- file:/config/
- file:/
- classpath:/config/
- classpath:/
以上順序按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級的配置內容會覆蓋低優先級配置的內容,其中配置文件中的內容是互補配置,即
存在相同的配置內容,高優先級的內容會覆蓋低優先級的內容存在不同的內容的時候,高優先級和低優先級的配置內容取並集我們也可以通過spring.config.location來改變默認的配置,具體做法就是項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置,指定配置文件和默認加載的配置文件共同起作用稱為互補配置
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties
外部配置的加載順序
命令行參數命令行參數的優先級是最高的,假定內部配置的最高優先級配置文件配置的啟動端口號是8081,啟動命令行參數如以下設置:
java -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8089
那么啟動的端口就改成了8089,命令行可以把項目的所有的配置選項全部都改掉
Spring Boot也可以從以下位置加載配置: 優先級從高到低順序,高優先級覆蓋低優先級,如有不同內容,高優先級和低優先級形成互補配置
- 來自java:comp/env的JNDI屬性
- java系統屬性(System.getProperties())
- 操作系統環境變量
- RandomValuePropertySource配置的random.*屬性值
- jar包外部的application-{profile}.properties或者application.yml(帶spring.profile)配置文件
- jar包內部的application-{profile}.properties或者application.yml(帶spring.profile)配置文件
- jar包外部的application.properties或者application.yml(不帶spring.profile)配置文件
- jar包內部的application.properties或者application.yml(不帶spring.profile)配置文件
- @Configuration注解類上的@PropertySource
- 通過SpringApplication.setDefaultProperties指定的默認屬性
其它
搭建springcloud項目,抽出了個公共的common模塊,其他服務依賴於common模塊。
我搭springboot項目一般習慣分application.yml
、application-dev.yml
、application-prod.yml
三個配置文件,application.yml
為主配置文件,通過spring.profiles.active
屬性指定其他配置文件,開發時指定為dev
環境,線上指定為prod
,方便切換。
問題
由於我將數據庫信息配置在了common模塊,同樣的建立了這三個配置文件。現在需要開發用戶user模塊,引入了common模塊,發現不會讀取common模塊的這三個配置文件,連不上數據庫。
原因
springboot如果自己有application.yml
,就會覆蓋依賴模塊的同名配置文件。spring.profiles.active
也是,先到自身resource目錄下找,如果找不到再去依賴模塊找。
例如我在user模塊建了application.yml
,common模塊的application.yml
就不會讀取。
在user模塊application.yml
配置了spring.profiles.active: dev
,但因為user模塊本身也有application-dev.yml
這個文件,所以不會再去讀取common的application-dev.yml
配置。
方法1
將common模塊的配置文件名稱改掉,例如改成application-common.yml
,然后在user模塊用spring.profiles.active: dev,common
同時引入。
因為user模塊沒有application-common.yml
,就會去common模塊找。
缺點:這種方法如果不小心起重名了,則會整個覆蓋,而不是作為補充。並且在切換線上線下環境時也不方便。
方法2
在common模塊的resource文件夾下創建個config
文件夾,把配置文件移入。官方文檔也是推薦這種方法。
這種方法若user模塊和common模塊的配置文件同時存在,會優先用user模塊的配置,common模塊的配置會作為補充