springboot讀取配置文件的順序


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:

  1. /config subdirectory of the current directory

  2. The current directory

  3. A classpath /config package

  4. The classpath root

The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

讀取位置就是:

  1. file:/config/
  2. file:/
  3. classpath:/config/
  4. 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也可以從以下位置加載配置: 優先級從高到低順序,高優先級覆蓋低優先級,如有不同內容,高優先級和低優先級形成互補配置

  1. 來自java:comp/env的JNDI屬性
  2. java系統屬性(System.getProperties())
  3. 操作系統環境變量
  4. RandomValuePropertySource配置的random.*屬性值
  5. jar包外部的application-{profile}.properties或者application.yml(帶spring.profile)配置文件
  6. jar包內部的application-{profile}.properties或者application.yml(帶spring.profile)配置文件
  7. jar包外部的application.properties或者application.yml(不帶spring.profile)配置文件
  8. jar包內部的application.properties或者application.yml(不帶spring.profile)配置文件
  9. @Configuration注解類上的@PropertySource
  10. 通過SpringApplication.setDefaultProperties指定的默認屬性

其它

搭建springcloud項目,抽出了個公共的common模塊,其他服務依賴於common模塊。

我搭springboot項目一般習慣分application.ymlapplication-dev.ymlapplication-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模塊的配置會作為補充


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM