在軟件開發(fā)過程中會經(jīng)歷開發(fā),測試,部署等多個階段,每個階段的配置不同,比如本地的開發(fā)環(huán)境所依賴的數(shù)據(jù)庫是本地的MySQL,而測試環(huán)境的數(shù)據(jù)庫依賴的是阿里云服務器中的云數(shù)據(jù)庫,到了部署階段可能依賴的數(shù)據(jù)庫又是自己公司部署的物理機上的數(shù)據(jù)庫,像這種只是一個數(shù)據(jù)庫的差異不同,還能通過手動修改配置文件完成數(shù)據(jù)庫的依賴,但是實際上的情況是現(xiàn)在的項目不再是單一的單體服務,而是復雜的分布式服務,一個完整的項目可能有幾個或者更多個小的的服務組成,服務間通過通絡通信,為了保證服務運行的穩(wěn)定性以及功能的需要就會引入一大堆的組件和工具,比如涉及到緩存會引入redis,涉及到服務間的通信會引入消息隊列,kafka或者mq,如果項目更復雜就會引入更多的工具和組件這個時候項目的配置就變得復雜起來了,如果在各個階段都需要通過手動修改配置文件來完成項目的配置,這對于開發(fā)者來說是極其的不友好,開發(fā)者應該把更多的事情放在開發(fā)上面,而不是在不停的復制粘貼的修改配置文件,有沒有一種簡單辦法呢?spring的profile功能進行配置參數(shù)的切換非常好的解決了這個問題
目前spring的profile提供了兩種激活方式如下
1.通過設置spring.profiles.default和spring.profiles.active這兩個屬性來激活和使用對應的配置文件。default為默認,如果沒有通過active來指定,那么就默認使用default定義的環(huán)境


激活需要的環(huán)境變量

在profile.activce沒有選擇需要激活的配置的情況下,spring會去加載默認的配置,如果就連默認的也沒有,我以前遇到一次忘記寫需要激活的配置,spring會把需要的配置從上到下進行加載,多數(shù)情況下會導致項目不能加載成功,這里建議大家進行本地開發(fā)的時候不要去使用這種修改配置文件的形式進行修改,遇到任何本地需要修改配置文件,但是僅僅只是本地開發(fā)需要修改配置文件,比如測試環(huán)境和部署環(huán)境的配置不需要改動的這種情況請通過idea提供的帶參數(shù)啟動來修改,避免污染配置文件導致后續(xù)步驟失敗

關于帶參數(shù)啟動這里也有多種寫法,這里不再講解,有興趣的可以自行百度
2.在程序中,也可以通過?@Profile("...") 對某些資源進行注解,這樣只有當選擇對應的環(huán)境時,才會產(chǎn)生對應的bean

對于以上的兩種方式個人其實建議第一種,原因有以下幾點
1.通過注解雖然沒有修改配置文件,但是等同于修改了配置文件
2.通過環(huán)境來選擇創(chuàng)建bean可能會導致在某一個環(huán)境下某一個bean出現(xiàn)NPE
3.通過修改注解形式不利于團隊協(xié)作開發(fā),一旦git提交忘記忽略注解所在的文件會給其他的同事帶來不必要的影響
4.這種注解形式相對于注解形式來說分布比較松散,難以修改到位
目前許多的服務的部署都是通過Jenkins或者docker部署,默認環(huán)境變量只能默認一個,比如我的默認環(huán)境只是適合測試環(huán)境通過Jenkins部署,如果我的正式環(huán)境是docker部署的這個怎么辦呢?難道還需要去修改配置文件的默認嗎?其實不用,jdk啟動過程中可以攜帶參數(shù)啟動
比如運行jar包時指定端口:java -jar xxx.jar --server.port=8088
帶參數(shù)啟動如果只是一兩個還好,可以直接寫在腳本文件里面,如果參數(shù)太多了這種方式就太過于復雜,而且對于docker部署的服務來說部署情況完全不一樣,那么帶參數(shù)啟動就適用了,這個時候還有一種就是通過在maven打包的過程中在節(jié)點中添加節(jié)點信息,maven會自動依據(jù)打包時候附帶的節(jié)點啟動信息去打出對應環(huán)境的jar,具體操作請參考https://blog.csdn.net/hjiacheng/article/details/57413933