Spring Boot框架提供了很多的默认配置,但是还是有部分配置需要我们自己手动配置。一般情况下,我们的配置都是写在application.properties或application.yml中,那么Spring Boot如何加载配置文件的呢?

这里我们从SpringApplication.run(class, args);开始,这里我们使用的Spring Boot的版本是都2.2.1.RELEASE。进入run方法,首先会初始化一个new SpringApplication(),在构造方法中会初始化一些变量,最重要的是下面这几行代码:

a4a0129f15c1e9c7ec643493658d0d82.png

在setInitializers和setListeners中都调用了getSpringFactoriesInstances,该方法从classpath上所有jar包中找出对应的META-INF/spring.factories属性文件,加载其中的初始化器和监听器并实例化。

4ccd61f3cf8484ac09ba1ba6a490a050.png

在SpringFactoriesLoader.loadFactoryNames方法中会调用SpringFactoriesLoader.loadSpringFactories获取spring.factories属性文件的初始化器和监听器。

911b3e0252fa0b0ceea387ba94df9970.png

spring.factories中有一个ConfigFileApplicationListener类,它会监听ApplicationEnvironmentPreparedEvent然后加载配置文件。

SpringBoot在创建ApplicationContext之前,会先调用prepareEnvironment方法准备创建容器所需要的环境,即创建Environment,并加载配置到Environment。这个过程中会调用SpringApplicationRunListeners#environmentPrepared方法发布Environment准备事件。

而ConfigFileApplicationListener监听到发布的event事件后会调用ConfigFileApplicationListener的onApplicationEvent方法,最终会调用load方法加载配置文件。

ConfigFileApplicationListener

a560fe2d08de20015db310ce781820ba.png

在ConfigFileApplicationListener中定义了一些默认的配置参数,比如配置文件的默认路径,配置文件的默认名称等等。

92911286fe4fffcd1ff0eae4ba04fecf.png

监听到事件后首先调用onApplicationEvent(ApplicationEvent event)方法:

af04d302c15f0e424346f8527a901ec7.png

参数event的类型便是
ApplicationEnvironmentPreparedEvent所以会接着调用
onApplicationEnvironmentPreparedEvent。

b21642402c62c2ce08ea85282ef75cd9.png


p
ostProcessEnvironment方法中调用
addPropertySources进而调用load方法进行配置文件的加载。

b5f671cd9c6a06dcf364347f8b416ca1.png

906c8dee52393f2c8e86b9bcb924090c.png

首先调用
initializeProfiles方法初始化profile,然后调用重载的load遍历所有配置文件的文件夹路径,读取配置。

00b0b1ff3d9dbd7f84bc83a7dec706a2.png


版权声明:本文为weixin_42604188原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42604188/article/details/113629955