目錄
需求
在開發的應用的時候總是需要有多環境的配置,本地測試dev,測試服務器部署test,正式服務器部署prod,各個開發團隊可能還有其他配置需求,這種配置文件是需要經常改的,可以寫在一起,每次改的時候吧不需要的部分打成註釋,但是多了以後相當麻煩,還容易出錯。
我的開發環境是Springboot,也現在用的越來越多的框架,逐漸走向主流,配置文件主要有兩種.properties和.yml,後者是Springboot的特色。
常見方式
框架提供多種加載配置文件的方式
1.最常見的@PropertySource在Bean的頭上括號參數是配置文件的路徑 @Value給變量自動賦值
2.@ConfigurationProperties + @PropertySource + @Value
3.YamlPropertiesFactoryBean + @Value
4.Environment自動生成Bean,內包含了所有配置信息
Springboot會自動加載配置文件,配置的是Springboot的自動配置類,配置的名稱必須對應包裏存在的,這種系統配置文件有固定的命名格式和指定的位置才能被Springboot讀取並解析
有以下4個位置
(項目文件):./config/
(項目文件):./
(resources類路徑):/config/
(resources類路徑):/
命名必須以application開頭
在主要的yml裏配置 spring.profiles.active: dev 系統就會自動的按以上順序在項目中找,同樣名字的以優先先的爲準。這樣在切換環境的時候就只用改這一個地方。
自定義配置
但是,以上配置都不是自定義的參數。自定義配置文件可以出現在resources裏的任何位置,通過@PropertySource等註解裏的路徑去找,不受系統環境管理,每次切換環境還得到配置文件裏打註釋,經常會忘而且麻煩。
最開始想到的是弄一個工具類,通過@Value讀取所有配置,然後代碼在用着工具類的配置,這樣就只需要改兩個地方。缺點:還是得改兩個地方,一旦配置文件加減字段時,工具類也得動,麻煩。
後來的解決辦法
建立三個自定以配置文件,可以和系統文件不放在一起,畢竟有四個位置可以放,四選一。
在application-dev.yml中配置spring.profiles.include: config-dev,完美的解決了自定義配置和系統配置的綁定。再用Environment的方法讀取
@Autowired
private Environment env;
env.getProperty("hello")
注意一個坑,Environment的Bean加載可能要比其他Bean晚,所以在給其他Bean類的全局變量賦值時可能是個null,所以只能在方法裏使用。