Profile配置
1.Profile是什麼
很多時候,我們專案在開發環境和生成環境的環境配置是不一樣的,例如,資料庫配置,在開發的時候,我們一般用測試資料庫,而在生產環境的時候,我們是用正式的資料,這時候,我們可以利用profile在不同的環境下配置用不同的配置檔案或者不同的配置。
spring boot允許你通過命名約定按照一定的格式(application-{profile}.properties)來定義多個配置檔案,然後通過在application.properyies通過spring.profiles.active來具體啟用一個或者多個配置檔案,如果沒有沒有指定任何profile的配置檔案的話,spring boot預設會啟動application-default.properties。
2.基於properties檔案型別
假如有開發、測試、生產三個不同的環境,需要定義三個不同環境下的配置。
你可以另外建立3個環境下的配置檔案:
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
複製程式碼
然後在applcation.properties檔案中指定當前的環境:spring.profiles.active=test
這時候讀取的就是application-test.properties檔案。
server.port=8001
# 啟用哪個配置檔案
spring.profiles.active=dev
spring.profiles.include=prod
複製程式碼
可以包含其他的配置檔案資訊
3.基於yml檔案型別
只需要一個applcation.yml檔案就能搞定,推薦此方式。
spring:
profiles:
active: prod
---
spring:
profiles: dev
server:
port: 8080
---
spring:
profiles: test
server:
port: 8081
---
spring.profiles: prod
spring.profiles.include:
- proddb
- prodmq
server:
port: 8082
---
spring:
profiles: proddb
db:
name: mysql
---
spring:
profiles: prodmq
mq:
address: localhost
複製程式碼
此時讀取的就是prod的配置,prod包含proddb,prodmq,此時可以讀取proddb,prodmq下的配置
也可以同時啟用三個配置spring.profiles.active: prod,proddb,prodmq
3.基於Java程式碼
在JAVA配置程式碼中也可以加不同Profile下定義不同的配置檔案,@Profile
註解只能組合使用@Configuration
和@Component
註解。
@Configuration
@Profile("prod")
public class ProductionConfiguration {
// ...
}
複製程式碼
4.指定Profile
不適用配置檔案,而是在啟動的時候進行指定的寫法
4.1 main方法啟動方式:
// 在IDE Arguments裡面新增
--spring.profiles.active=prod
複製程式碼
優先順序高於在配置檔案裡面的啟用的
4.2 JVM啟動方式
-Dspring.profiles.active=dev
複製程式碼
4.3 外掛啟動方式
spring-boot:run -Drun.profiles=prod
複製程式碼
4.4 jar執行方式
java -jar xx.jar --spring.profiles.active=prod
複製程式碼
除了在配置檔案和命令列中指定Profile,還可以在啟動類中寫死指定,通過SpringApplication.setAdditionalProfiles方法
public void setAdditionalProfiles(String... profiles) {
this.additionalProfiles = new LinkedHashSet<String>(Arrays.asList(profiles));
}
複製程式碼
配置檔案載入位置
spring boot 啟動會掃描以下位置的application.properties或者application.yml檔案作為Spring boot的預設配置檔案:
-
file:./config/
- 優先順序最高(專案根路徑下的config
) -
file:./
- 優先順序第二 -(專案根路徑下) -
classpath:/config/
- 優先順序第三(專案resources/config
下) -
classpath:/
- 優先順序第四(專案resources
根目錄)
重要的規則,跟我們之前學過的不太一樣
-
高優先順序配置
會覆蓋低優先順序配置
-
多個配置檔案
互補
-
比如,兩個同名檔案裡面有相同的配置,相同的配置會被高優先順序的配置覆蓋
A配置優先順序大於B配置
server: port: 8080 複製程式碼
B配置優先順序小於A配置
server: port: 8081 context-path: /hanpang 複製程式碼
專案啟動後訪問地址為:
http://127.0.0.1:8080/hanpang
,這就是所謂的互補
-
-
通過配置spring.config.location來改變預設配置
java -jar demo-xxx.jar --spring.config.location=C:/application.properties 複製程式碼
這對於運維來說非常方便,在不破壞原配置情況下輕鬆修改少量配置就可以達到想要的效果
外部配置載入順序
來自於網路,個人沒有進行相關的測試
SpringBoot也可以從以下位置載入配置:優先順序從高到低;高優先順序的配置覆蓋低優先順序的配置,所有的配置會形成互補配置。
-
命令列引數
-
所有的配置都可以在命令列上進行指定;
-
多個配置用空格分開; --配置項=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc 複製程式碼
-
-
來自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)配置檔案
由jar包外向jar包內進行尋找,優先載入待profile的,再載入不帶profile的。
-
@Configuration註解類上的@PropertySource
-
通過SpringApplication.setDefaultProperties指定的預設屬性