本文主要是通过debug来查看Springboot启动时如何加载resources目录下的配置文件:
SpringBoot刚开始执行的是SpringApplication类的run方法
这个最终获得的environment对象就是我们在resources目录下配置的文件信息;
我们通过一个线程执行的过程来查看具体经过哪些类和方法:
ConfigFileApplicationListener类是Springboot获取配置文件的核心类,具体执行流程如下:
1、load()方法执行
第一个红框是获取profiles配置是测试还是预发
第二个红框是获取第一个需要加载的配置文件application.yml
第三个红框是根据application.yml文件中的spring.profiles.active:test来查找application-test.xml文件,这个application-{profiles}.xml是固定形式
第二个红框具体实现如下:
getSearchLocations()方法主要是获取配置文件路径:通过这段forEach循环代码中我们可以看到是把每个取出的路径进行循环遍历
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
loader.getFileExtensions()方法获取后缀然后进行遍历,所以这是一个双循环,文件路径遍历然后再进行配置文件后缀名遍历,直到找到对应路径下的application.*(就是我们resources下所配置的文件,application是必须要这个名称,后缀就是下面所包含的任一后缀都可以查找到)文件
Springboot可以识别的四种配置文件后缀:
“properties”, “xml”,“yml”, “yaml”
debug代码如下:
PropertySourceLoader接口类的getFileExtensions()方法可以获得后缀字符串数组,主要是从两个实现类获取,分别是PropertiesPropertySourceLoader和YamlPropertySourceLoader类。
第三个红框具体实现如下:
执行流程是首先还是从getSearchLocations()获取默认的路径进行遍历,寻找application.yml文件中配置的需要加载的文件,例如application-test.yml,这个过程跟寻找application.yml类似,都是通过遍历来寻找文件(路径和后缀组合的方式),直到在对应路径下找到对应的文件才开始继续往下执行
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
获得配置信息后存储到对象中,方便后续调用;
这有一个链接,我看了下对springboot源代码执行步骤分析的比较透彻,可以参考看下:
https://www.cnblogs.com/lay2017/p/11478742.html