更多Spring文章,歡迎點擊 一灰灰Blog-Spring專題java
前面一篇主要介紹的是如何獲取配置信息,接下來則是另一個很是很是基礎和必要的知識點了,應用如何根據不一樣的環境來選擇對應的配置,即配置的多環境選擇問題git
<!-- more -->github
配置區分環境,最直觀的如測試環境和生產環境的DB不一樣,測試環境的應用要求鏈接測試DB;生成環境的應用要求連生成DB;對於應用自己來講,業務代碼啥的都是同樣,無非就是DB的配置不一樣,若是在代碼中寫死環境判斷,而後進行選擇配置話,就不太優雅了;spring
SpringBoot自己就支持多環境配置文件,應用的配置,除了 application.yml
文件以外,還會有環境相關的配置,以下一個實例app
application.yml application-dev.yml application-pro.yml
配置文件,通常要求是以 application
開頭,能夠是yml文件也能夠是properties文件dom
如何肯定哪一個配置配置文件(application-dev.yml 與 application-pro.yml)生效呢?spring-boot
spring.profile.active
來指定須要加載的配置文件一般這個配置信息會放在 applicatin.yml
文件中,以下工具
spring: profiles: active: dev
上面這個表示,當前的配置信息,會從 application.yml
和 application-dev.yml
文件中獲取;且-dev
文件中定義的配置信息,會覆蓋前面的配置信息學習
注意開發工具
配置文件內容以下
application.yml
# 端口號 server: port: 8081 spring: profiles: active: dev,biz biz: total: application
application-dev.yml
biz: env: dev-environment profile: dev-profile
application-pro.yml
biz: env: pro-environment profile: pro-profile
application-biz.yml
biz: whitelist: a,b,c,d,e,f,g ratelimit: 1,2,3 total: application-biz profile: biz-profile
經過前面的規則進行分析,當前選中生效的配置文件爲
application
的配置代碼驗證以下
package com.git.hui.boot.properties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; /** * Created by @author yihui in 09:17 18/9/20. */ @SpringBootApplication public class Application { public Application(Environment environment) { String env = environment.getProperty("biz.env"); String whitelist = environment.getProperty("biz.whitelist"); String ratelimit = environment.getProperty("biz.ratelimit"); String total = environment.getProperty("biz.total"); String profile = environment.getProperty("biz.profile"); // application.yml文件中的配置 spring.profile.active指定具體選中的配置文件,爲 application-dev 和 application-biz // read from application-dev.yml System.out.println("env: " + env); // read from application-biz.yml System.out.println("whitelist: " + whitelist); System.out.println("ratelimit: " + ratelimit); // 當配置文件 application.yml, application-dev.yml, application-biz.yml 三個文件都存在時,覆蓋規則爲 // biz > dev > application.yml (其中 biz>dev的原則是根據 spring.profile.active 中定義的順序來的,最右邊的優先級最高) // read from application-biz.yml System.out.println("total: " + total); // read from application-biz.yml System.out.println("profile: " + profile); } public static void main(String[] args) { SpringApplication.run(Application.class); } }
輸出結果爲
env: dev-environment whitelist: a,b,c,d,e,f,g ratelimit: 1,2,3 total: application-biz profile: biz-profile
上面雖然看是實現了多環境的配置問題,但看完以後有一個明顯的疑問,選擇環境的配置信息寫死在application.yml
文件中,難道說部署到測試和生產環境時,還得記得手動改這個配置的值麼?
若是是這樣的話,也太容易出問題了吧。。。
那麼如何解決這個問題呢,常見的一種方式是經過啓動腳本,傳入當前環境的參數,來覆蓋選中的環境
默認的配置文件是放在 src/main/resources
目錄下,固然也是能夠放其餘位置的
/config
子目錄中上面的優先級是從高到低來的,即外置的改與內置的;config下面的高於根目錄下的
之內置的兩個進行對比,實測結果以下
前面一篇中,遺留了一個問題,就是在配置文件中配置了屬性 user.name = 一灰灰blog
, 可是實際取出的倒是 user
(我我的的電腦用戶名),也就是說,Environment中讀取的配置信息,不只僅是從配置文件中獲取,還要其餘的一些配置信息來源
根據優先級對屬性來源進行排序,以下
看了上面的配置信息來源,咱們能夠如何優雅的實現不一樣環境選擇不一樣的配置文件呢?有下面兩個容易想到和實現的方式了
這種實現思路就是在啓動腳本中,傳入當前環境,而後覆蓋掉屬性 --spring.profiles.active
,對業務來講,就不須要作任何的改動了,只要啓動腳本自己區分環境便可,惟一的要求就是遵循統一的規範,一個簡單的實現以下
假定命令行的第一個參數就是環境,取出這個參數,傳入便可
public static void main(String[] args) { if (args.length > 0) { SpringApplication.run(Application.class, "--spring.profiles.active=" + args[0] + ",biz"); } else { SpringApplication.run(Application.class); } }
實測結果,注意下面紅框內的pro,覆蓋了配置文件中的dev
說明
固然能夠直接傳入完整的命令行參數--spring.profiles.active=pro,biz
,這樣代碼內部就不須要進行特殊處理
當程序以獨立的jar運行時,我我的的感受是外置的配置文件是優於內置的配置文件的;由於修改配置的話,不須要從新打包部署,直接改便可
這種實現方式也沒啥好多說的,至關於把配置文件拉出來放在外面而已,再根據環境寫具體的spring.profiles.active
的值
spring.profiles.active
來指定spring.profiles.active
參數指定多個配置文件時,右邊的優於左邊的--key=value
一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛
盡信書則不如,已上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
一灰灰blog
知識星球