Spring Boot框架提供了很多的默认配置,但是还是有部分配置需要我们自己手动配置。一般情况下,我们的配置都是写在application.properties或application.yml中,那么Spring Boot如何加载配置文件的呢?
这里我们从SpringApplication.run(class, args);开始,这里我们使用的Spring Boot的版本是都2.2.1.RELEASE。进入run方法,首先会初始化一个new SpringApplication(),在构造方法中会初始化一些变量,最重要的是下面这几行代码:
在setInitializers和setListeners中都调用了getSpringFactoriesInstances,该方法从classpath上所有jar包中找出对应的META-INF/spring.factories属性文件,加载其中的初始化器和监听器并实例化。
在SpringFactoriesLoader.loadFactoryNames方法中会调用SpringFactoriesLoader.loadSpringFactories获取spring.factories属性文件的初始化器和监听器。
spring.factories中有一个ConfigFileApplicationListener类,它会监听ApplicationEnvironmentPreparedEvent然后加载配置文件。
SpringBoot在创建ApplicationContext之前,会先调用prepareEnvironment方法准备创建容器所需要的环境,即创建Environment,并加载配置到Environment。这个过程中会调用SpringApplicationRunListeners#environmentPrepared方法发布Environment准备事件。
而ConfigFileApplicationListener监听到发布的event事件后会调用ConfigFileApplicationListener的onApplicationEvent方法,最终会调用load方法加载配置文件。
ConfigFileApplicationListener
在ConfigFileApplicationListener中定义了一些默认的配置参数,比如配置文件的默认路径,配置文件的默认名称等等。
监听到事件后首先调用onApplicationEvent(ApplicationEvent event)方法:
参数event的类型便是
ApplicationEnvironmentPreparedEvent所以会接着调用
onApplicationEnvironmentPreparedEvent。
在
p
ostProcessEnvironment方法中调用
addPropertySources进而调用load方法进行配置文件的加载。
首先调用
initializeProfiles方法初始化profile,然后调用重载的load遍历所有配置文件的文件夹路径,读取配置。