Spring Cloud中配置文件的加載機制與其它的Spring Boot應用存在不一樣的地方;如它引入了bootstrap.properties的配置文件,同時也支持從配置中心中加載配置文件等;本文主要聚焦在這些配置文件加載的優先級及覆蓋關系的控制上,對於幫助理解Spring Cloud的配置文件加載方式有一定的幫助。
1. bootstrap上下文
Spring中加載的配置文件是分層級的;
Spring Cloud啟動的時候會創建一個bootstrap的上下文,它是應用的父級上下文(請注意這里所說的bootstrap指的是是啟動最開始時加載的配置項,與bootstrap.yml或者說bootstrap.properties是兩碼事,這點很容易混淆);它負責從一些外部環境中加載配置項,如配置中心;這部分配置項的優先級是最高的,因此它不會被其它的配置文件中加載的配置項給覆蓋。
bootstrap的上下文使用另外一種機制來加載額外的配置文件,相對於從application.properties(或者yml)中加載配置文件中加載配置項,你也可以選擇從bootstrap.properties(yml)中加載,以區分boostrap上下文中加載的配置項和主上下文加載的配置項。
可以在系統配置項或者啟動命令參數中指定不使用bootstrap機制加載配置項:
spring.cloud.bootstrap.enabled=false
2. 配置項加載位置
Spring Cloud應用加載的配置項可以來自於以下幾個位置:
啟動命令中指定的配置項;
操作系統配置項;
環境變量
配置中心中的配置文件;
本地的application.properties(yml)
本地boostrap.properties(yml)
這幾個位置的配置項從上往下優先級遞減,即從上面位置加載的配置項會覆蓋下面位置加載的配置項。如application.properties中加載的配置項優先級要高於bootstrap.properties中加載的配置項
3.配置項的覆蓋配置
默認情況下,從Spring Cloud Config中加載的配置項,是不能被本地的配置項覆蓋的,如果想要覆蓋這些配置項,需要在配置中心的配置文件中(或者系統配置項、命令行配置項中等)添加以下配置項(注意本地配置文件中增加該配置無任何意義)
spring.cloud.config.allowOverride=true
表示本地的配置文件(如bootstrap.yml或者application.yml)中的配置項可以覆蓋遠程的配置項,默認是false;