SpringBoot 系列之配置文件加载

本文详细解释了SpringBoot如何通过EnvironmentPostProcessor和ConfigDataEnvironmentPostProcessor加载配置文件,包括配置文件的定义顺序、解析过程和文件加载顺序。重点介绍了ConfigDataEnvironment和相关组件的作用。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在我们使用 SpringBoot 开发过程中,会在配置文件(application.properties 或者 application.yml)中写一些公共的配置,那么 SpringBoot 是如何加载配置文件的呢?

1. 发布事件

结合我们前面介绍的SpringBoot中的监听事件机制,我们首先看下SpringApplication.run()方法,在该方法中会针对SpringBoot项目启动的不同的阶段来发布对应的事件。
在这里插入图片描述
在这里插入图片描述

2. 监听器

监听这个事件的监听器是EnvironmentPostProcessorApplicationListener,所以我们看下这个监听器都干了些什么?
在这里插入图片描述

开始处理执行实现 EnvironmentPostProcessor类的postProcessEnvironment方法。在这里插入图片描述
实现EnvironmentPostProcessor的类有 6 个
在这里插入图片描述

Spring Boot使用ConfigDataEnvironmentPostProcessor来加载配置文件。这个类实现了EnvironmentPostProcessor接口,它的postProcessEnvironment方法会被调用,以加载配置数据。
在这里插入图片描述
在postProcessEnvironment这个方法中,创建ConfigDataEnvironment实例,然后执行其processAndApply
在这里插入图片描述

这里主要创建ConfigDataLocationResolvers,ConfigDataLoaders以及ConfigDataEnvironmentContributors。在这里插入图片描述
在这里插入图片描述
加载配置文件位置解析器
在这里插入图片描述
配置数据加载器,将配置文件的内容解析成应用程序可用的配置信息。
在这里插入图片描述
在这里插入图片描述
接下来我们再看回去看ConfigDataEnvironment类的构造方法中this.contributors = createContributors(binder);这段代码
在这里插入图片描述
这里决定了配置文件加载的顺序
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

由上面的代码可知:
配置文件的定义顺序为:

optional:classpath:/
optional:classpath:/config/
optional:file:./
optional:file:./config/
optional:file:./config/*/

配置文件加载顺序为:

file:./
file:./config/
file:./config/*/
classpath:/
classpath:/config/

接下来,开始执行processAndApply()方法了。
在这里插入图片描述
在这里插入图片描述
这里就开始加载和解析配置文件了
在这里插入图片描述
在这里插入图片描述
resolve 解析
在这里插入图片描述
resolve会调用ConfigDataEnvironment中创建的解析器,比如:StandardConfigDataLocationResolver,然后去解析ConfigDataEnvironmentContributor中保存的配置文件的路径。StandardConfigDataLocationResolver会先把路径拿出来按照;进行拆分
(方法在ConfigDataLocation中),然后组装每个路径下的文件位置信息,对于文件名默认都为application,对于文件类型,需要使用到PropertySourceLoader他有两个子类:YamlPropertySourceLoader和PropertiesPropertySourceLoader,通过getFileExtensions方法获取文件类型。其中PropertiesPropertySourceLoader对应properties和xml,而YamlPropertySourceLoader对应yml以及yaml。
在这里插入图片描述
这样就可以用ConfigDataLocation路径+applicaiton+getFileExtensions得到一组文件路径。
在这里插入图片描述
然后解析器会检查这些文件是否存在,如果不存在的则会过滤掉。
在这里插入图片描述
最后将找到的文件放入StandardConfigDataResource集合中返回,由load方法去加载数据。

load 加载:
load方法将resolve方法解析出来的文件路径,有对应的加载器去文件中将数据取出来。
在这里插入图片描述
这里需要注意的是,读取文件是从最后一个开始读取,即跟文件加载顺序相反,所以配置加载顺序为:

file:./config/*/
file:./config/
file:./
classpath:/config/
classpath:/

在这里插入图片描述
将读取的数据封装到ConfigData当中返回。最后将数据组装到ConfigDataEnvironmentContributors中,最后把数据放入当前应用环境中

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值