一、前言
在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件;
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application*.xml</param-value>
</context-param>
而到了springboot时代,我们发现原来熟悉的web.xml已不复存在,但是springboot却依然可以找到默认的配置文件(application.yml),那它是如何实现的呢?今天我们就一起来探究一下springboot自动加载配置文件的机制!
看完本篇文章你将了解到:
springboot什么时候加载配置文件
springboot通过哪个类加载配置文件
springboot自动加载配置文件流程
激活文件优先级
文件加载路径优先级
文件后缀优先级
二、提出猜想
我们知道在使用springboot中我们只要在resources下面新建一个application.yml文件他就会自动加载,那是不是springboot默认在哪里配置了这个路径和文件名?
三、验证猜想
为了证实我们的猜想,我们可以通过查看springboot项目源码,跟着debug一步一步走;
这里我使用的是springboot2.0版本,2.0与1.5版本比较启动的大体流程是一样的,只不过在一些实现中有所差异;
1.启动流程
要知道springboot如何加载配置文件,就需要了解它的启动流程:
我们从main方法进入,大概的调用流程如下:
DemoApplication.main->SpringApplication.run->new SpringApplication().run
在这里插入图片描述
其实启动的主要过程都在new SpringApplication().run();
new SpringApplication():创建SpringApplication实例,负责加载配置一些基本的环境变量、资源、构造器、监听器
run():负责springboot整个启动过程,包括加载创建环境、打印banner、配置文件、配置应用上下文,加载bean等等sb整个生命周期几乎都在run方法中;
今天我们的主题是sb如何加载配置文件,所以着重讲解加载配置文件和之前的操作原理和源码,其他的功能以后有机会再和大家一起研究,下面我们来看看new SpringApplication()做了什么操作;
2.创建SpringApplication实例
/**
* 创建一个SpringApplication实体,应用程序上下文将从指定的主源文档加载bean以获取详细信息,
* 这个实例可以在调用之前自定义
* @param resourceLoader
* @param primarySources
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
//使用的资源加载器
this.resourceLoader = resourceLoader;
//主要的bean资源 primarySources【在这里是启动类所在的.class】,不能为null,如果为null,抛异常
Assert.notNull(primarySources, "PrimarySources must not be null");
//启动类的实例数组转化成list,放在LinkedHashSet集合中
this.primarySources = new LinkedHashSe