一、分场景说明
1.相同文件类型
优先级顺序如下,从前往后,优先级递增,优先级高的覆盖优先级低配置,file:./config/优先级最高
classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/
file:./表示从工程根目录开始查找;
2.不同文件类型
properties->xml->yml->yaml
properties最先加载,yaml最后加载
3.关于Profile
加载的文件名规则:application-{profile}.文件类型
3.1.spring.profiles.include
可以同时让多个配置文件生效,多个用逗号分隔,后面的覆盖前面的
3.2.spring.profiles.active
使一个配置文件生效;如果不配置active,默认active为default;
3.3.当active和include配置同时存在
active优先级高于include;
3.4.嵌套
application配置文件嵌套的application-profile配置文件,application-profile再嵌套application-profile时,加载顺序从外到内,最深层嵌套的优先级最高,覆盖外层;
3.5.默认配置文件
文件名不带profile的为默认配置文件,有别于application-default文件,application-profile覆盖application默认配置文件;
二、关于”覆盖“的说明
我们所说的覆盖其实不是真正意义上的覆盖,也不是在spring容器加载的时候处理,而是在取数据的时候,关键源码:
org.springframework.core.env.AbstractEnvironment#getProperty(java.lang.String)
遍历所有已加载的配置文件PeropertySource,优先级高的放在list前面,根据key值依次取值,取到值时,直接return,所以,给人一种覆盖的现象;所有配置文件内容一直都存放在内存;