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.yml,application.yaml,applicaiton.properties
⑥ 本地boostrap.yml,bootstrap.yaml,bootstrap.properties
这几个位置的配置项从上往下优先级递减,即从上面位置加载的配置项会覆盖下面位置加载的配置项。如application.properties中加载的配置项优先级要高于bootstrap.properties中加载的配置项
3. 配置项的覆盖配置
默认情况下,从Spring Cloud Config中加载的配置项,是不能被本地的配置项覆盖的,如果想要覆盖这些配置项,需要在配置中心的配置文件中(或者系统配置项、命令行配置项中等)添加以下配置项(注意本地配置文件中增加该配置无任何意义)
spring.cloud.config.allowOverride=false
true表示本地的配置文件(如bootstrap.yml或者application.yml)中的配置项可以覆盖远程的配置项,默认是false;
4. spring.profiles.active(include)的优先级关系
spring.profiles.active是能覆盖配置文件中的配置的,其中spring.profiles.active 的优先级高于 spring.profiles.include。同时spring.profiles.active=dev,version-1.0.0,中形式可以用于指定多份配置文件,其中 verison-1.0.0 中的优先级会高于前面的配置dev。
spring.profiles.include 的规则也是同样的。
spring.cloud.config.allowOverride=false
true表示本地的配置文件(如bootstrap.yml或者application.yml)中的配置项可以覆盖远程的配置项,默认是false;
spring.profiles.active(include)的优先级关系
spring.profiles.active是能覆盖配置文件中的配置的,其中spring.profiles.active 的优先级高于 spring.profiles.include。同时spring.profiles.active=dev,version-1.0.0,中形式可以用于指定多份配置文件,其中 verison-1.0.0 中的优先级会高于前面的配置dev。
spring.profiles.include 的规则也是同样的。