踩坑,结合profile深入理解spring.config.additional-location

关于SpringBoot配置文件的优先级,官网给出了下面这段话:

Externalized Configuration

踩坑,结合profile深入理解spring.config.additional-location_第1张图片

 但按照我对他的文字理解和验证结果对不上。下面结合源码和验证结果,简单说一下我对这个规则的理解。

结论

踩坑,结合profile深入理解spring.config.additional-location_第2张图片

SpringBoot配置文件的优先级,按我理解(见上图):

  1. profile优先级。当不配置active的profile时,默认profile为null,优先级最低
  2. 路径优先级:profile相同时,它会按照优先级顺序依次去对应的配置文件

归并结果时:

  1. 同一个profile(上述表格同一行)从右往左依次覆盖(越左优先级越高),每一行(profile)得到一个归并的结果
  2. 每一行的归并结果,再按照profile优先级,从上往下依次覆盖(越下优先级越高),得到最终的归并结果

场景验证

问题:spring.config.additional-location下的yml是否生效(最终覆盖,最高优先级)?

场景1

现有一个test项目,将profile设置为deploy编译,编译后如下:

踩坑,结合profile深入理解spring.config.additional-location_第3张图片

 启动test项目时,加上启动参数(注意,当spring.config.additional-location指定为目录时,最后一定要加斜杠"/",否则报错):

spring.config.additional-location=file:E:/project/demo/config/

而 E:/project/demo/config/ 下也有一个同名的 application-deploy.yml

踩坑,结合profile深入理解spring.config.additional-location_第4张图片

答案:从上述表格可知生效,E:/project/demo/config/ 下的application-deploy.yml优先级最高

场景2

场景1当中,其他不变,将E:/project/demo/config/ 下也有一个同名的 application-deploy.yml 改名为 application.yml

踩坑,结合profile深入理解spring.config.additional-location_第5张图片

答案:从上述表格可知不生效,classpath(target/classes)下的application-deploy.yml优先级最高

场景3

场景1当中,其他不变,将启动参数改为

spring.config.additional-location=file:E:/project/demo/config/application-deploy.yml

踩坑,结合profile深入理解spring.config.additional-location_第6张图片

答案:从上述表格可知不生效,classpath(target/classes)下的application-deploy.yml优先级最高

为什么上述表格这么填。因为默认profile(null)优先级是最低的,所以肯定先对它进行搜索。

踩坑,结合profile深入理解spring.config.additional-location_第7张图片

 源码出处

基本上逻辑都在ConfigFileApplicationListener,但我并没有完全看懂

你可能感兴趣的:(#,SpringBoot,spring,java,spring,boot,外部配置)