Profile配置和加載配置文件

Profile配置

image

1.Profile是什么

很多時候,我們項目在開發(fā)環(huán)境和生成環(huán)境的環(huán)境配置是不一樣的,例如,數(shù)據(jù)庫配置,在開發(fā)的時候,我們一般用測試數(shù)據(jù)庫,而在生產(chǎn)環(huán)境的時候,我們是用正式的數(shù)據(jù),這時候,我們可以利用profile在不同的環(huán)境下配置用不同的配置文件或者不同的配置。

spring boot允許你通過命名約定按照一定的格式(application-{profile}.properties)來定義多個配置文件,然后通過在application.properyies通過spring.profiles.active來具體激活一個或者多個配置文件,如果沒有沒有指定任何profile的配置文件的話,spring boot默認會啟動application-default.properties。

2.基于properties文件類型

image

假如有開發(fā)、測試、生產(chǎn)三個不同的環(huán)境,需要定義三個不同環(huán)境下的配置。

你可以另外建立3個環(huán)境下的配置文件:

applcation.properties
application-dev.properties
application-test.properties
application-prod.properties

然后在applcation.properties文件中指定當前的環(huán)境: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
image

優(yōu)先級高于在配置文件里面的激活的

4.2 JVM啟動方式

-Dspring.profiles.active=dev
image

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/ - 優(yōu)先級最高(項目根路徑下的config

  • file:./ - 優(yōu)先級第二 -(項目根路徑下)

  • classpath:/config/ - 優(yōu)先級第三(項目resources/config下)

  • classpath:/ - 優(yōu)先級第四(項目resources根目錄)

image

重要的規(guī)則,跟我們之前學過的不太一樣

  1. 高優(yōu)先級配置會覆蓋低優(yōu)先級配置

  2. 多個配置文件互補

    • 比如,兩個同名文件里面有相同的配置,相同的配置會被高優(yōu)先級的配置覆蓋

      A配置優(yōu)先級大于B配置

      server:
         port: 8080
      

      B配置優(yōu)先級小于A配置

      server: 
         port: 8081
         context-path: /hanpang
      

      項目啟動后訪問地址為:http://127.0.0.1:8080/hanpang,這就是所謂的互補

  3. 通過配置spring.config.location來改變默認配置

    java -jar demo-xxx.jar --spring.config.location=C:/application.properties
    

    這對于運維來說非常方便,在不破壞原配置情況下輕松修改少量配置就可以達到想要的效果

外部配置加載順序

來自于網(wǎng)路,個人沒有進行相關的測試

SpringBoot也可以從以下位置加載配置:優(yōu)先級從高到低;高優(yōu)先級的配置覆蓋低優(yōu)先級的配置,所有的配置會形成互補配置。

  1. 命令行參數(shù)

    • 所有的配置都可以在命令行上進行指定;

    • 多個配置用空格分開; --配置項=值

      java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar 
      --server.port=8087 --server.context-path=/abc
      
  2. 來自java:comp/env的JNDI屬性

  3. Java系統(tǒng)屬性(System.getProperties())

  4. 操作系統(tǒng)環(huán)境變量

  5. RandomValuePropertySource配置的random.*屬性值

  6. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

  7. jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

  8. .jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

  9. jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件

    由jar包外向jar包內(nèi)進行尋找,優(yōu)先加載待profile的,再加載不帶profile的。

  10. @Configuration注解類上的@PropertySource

  11. 通過SpringApplication.setDefaultProperties指定的默認屬性

加載配置文件方式參考官網(wǎng)地址

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容