一、分场景说明

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,所以,给人一种覆盖的现象;所有配置文件内容一直都存放在内存;

三、欢迎提问和补充