不少時候,咱們項目在開發環境和生成環境的環境配置是不同的,例如,數據庫配置,在開發的時候,咱們通常用測試數據庫,而在生產環境的時候,咱們是用正式的數據,這時候,咱們能夠利用profile在不一樣的環境下配置用不一樣的配置文件或者不一樣的配置。html
spring boot容許你經過命名約定按照必定的格式(application-{profile}.properties)來定義多個配置文件,而後經過在application.properyies經過spring.profiles.active來具體激活一個或者多個配置文件,若是沒有沒有指定任何profile的配置文件的話,spring boot默認會啓動application-default.properties。java
假若有開發、測試、生產三個不一樣的環境,須要定義三個不一樣環境下的配置。mysql
你能夠另外創建3個環境下的配置文件:spring
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
複製代碼
而後在applcation.properties文件中指定當前的環境:spring.profiles.active=test
這時候讀取的就是application-test.properties文件。sql
server.port=8001
# 激活哪一個配置文件
spring.profiles.active=dev
spring.profiles.include=prod
複製代碼
能夠包含其餘的配置文件信息數據庫
只須要一個applcation.yml文件就能搞定,推薦此方式。app
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
dom
在JAVA配置代碼中也能夠加不一樣Profile下定義不一樣的配置文件,@Profile
註解只能組合使用@Configuration
和@Component
註解。spring-boot
@Configuration
@Profile("prod")
public class ProductionConfiguration {
// ...
}
複製代碼
不適用配置文件,而是在啓動的時候進行指定的寫法
// 在IDE Arguments裏面添加
--spring.profiles.active=prod
複製代碼
優先級高於在配置文件裏面的激活的
-Dspring.profiles.active=dev
複製代碼
spring-boot:run -Drun.profiles=prod
複製代碼
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指定的默認屬性