今天被問到springcloud的讀取配置文件的優先級,起初我以爲讀取配置文件的優先級是根據項目的配置環境,然後巴拉巴拉說了一大堆,結果發現我理解錯了,
其實就是指的是在項目的配置文件優先級,查了下資料,總結了下
首先要明白:springcloud的加載配置文件的機制和springboot應用加載配置文件有所差別,如它引用了bootstrap.properties的配置文件,同時也支持配置中心加載配置文件,這裏主要簡述下配置文件加載的優先級及覆蓋關係的控制上,
1.bootstrap上下文
springboot啓動的時候會去創建一個bootstrap上下文,他是引用父級上下文
(請注意這裏所說的bootstrap指的是是啓動最開始時加載的配置項,與bootstrap.yml或者說bootstrap.properties是兩碼事,這點很容易混淆)
它負責從一些外部環境中加載配置項,如配置中心;這部分配置項的優先級是最高的,因此它不會被其它的配置文件中加載的配置項給覆蓋。
bootstrap的上下文使用另外一種機制來加載額外的配置文件,相對於從application.properties(或者yml)中加載配置文件中加載配置項,你也可以選擇從bootstrap.properties(yml)中加載,以區分boostrap上下文中加載的配置項和主上下文加載的配置項。
可以在系統配置項或者啓動命令參數中指定不使用bootstrap機制加載配置項:
spring.cloud.bootstrap.enabled=false
2.配置加載位置
springcloud應用加載項可以來自以下幾個位置
1.啓動命令中指定位置
2.操作系統配置項
3.環境變量
4.配置中心的配置文件
5.本地的application.properties(yml)
6.本地boostrap.properties(yml)
這幾個位置的配置項從上往下優先級遞減,即從上面位置加載的配置項會覆蓋下面位置加載的配置項。如application.properties中加載的配置項優先級要高於bootstrap.properties中加載的配置項
3.配置項的覆蓋配置
默認情況下,從Spring Cloud Config中加載的配置項,是不能被本地的配置項覆蓋的,如果想要覆蓋這些配置項,需要在配置中心的配置文件中(或者系統配置項、命令行配置項中等)添加以下配置項(注意本地配置文件中增加該配置無任何意義)
spring.cloud.config.allowOverride=true
參考:https://www.cnblogs.com/Mr-Rocker/p/10690304.html