关于SpringBoot配置文件的优先级,官网给出了下面这段话:
但按照我对他的文字理解和验证结果对不上。下面结合源码和验证结果,简单说一下我对这个规则的理解。
结论
SpringBoot配置文件的优先级,按我理解(见上图):
- profile优先级。当不配置active的profile时,默认profile为null,优先级最低
- 路径优先级:profile相同时,它会按照优先级顺序依次去对应的配置文件
归并结果时:
- 同一个profile(上述表格同一行)从右往左依次覆盖(越左优先级越高),每一行(profile)得到一个归并的结果
- 每一行的归并结果,再按照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,但我并没有完全看懂