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

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

Externalized Configuration

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

结论

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

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

归并结果时:

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

场景验证

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

场景1

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

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

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

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

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

场景2

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

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

场景3

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

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

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

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

 源码出处

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值