springboot加载application资源文件源码分析
2018-03-24 本文已影响0人
圣村的希望
springboot默认支持加载application.properties或者application.yml配置文件,我们有些散落的配置可以统一配置在配置文件中方便管理,这样但不支持动态动态修改,建议配置在zookeeper中,能够支持修改立即生效。
下面分析springboot默认支持的配置文件:
在分析监听器时,我们知道ConfigFileApplicationListener监听器是用来进行配置资源文件加载的,可以看到其实现了SmartApplicationListener类的supportsEventType方法,它对ApplicationEnvironmentPreparedEvent和ApplicationPreparedEvent两个事件进行了监听。
![](https://img.haomeiwen.com/i7277612/188535035b1878a2.png)
所以在环境准备的时候会去触发对应事件,所以在这个时候就会触发配置文件的加载
![](https://img.haomeiwen.com/i7277612/d6d13b62f7ea8332.png)
postProcessor.postProcessEnvironment(event.getEnvironment(),
event.getSpringApplication())这里会去进行属性值的加载
![](https://img.haomeiwen.com/i7277612/f897d83676ae9407.png)
将RandomValuePropertySource添加到环境中支持Random类的随机数的配置
Loader(environment, resourceLoader).load()加载资源文件
![](https://img.haomeiwen.com/i7277612/dc8e0b2ea9f63099.png)
这里面再看while里面的load方法
![](https://img.haomeiwen.com/i7277612/26894b0e90937a0a.png)
再看getSearchLocations()方法
![](https://img.haomeiwen.com/i7277612/96086b1932770ece.png)
首先看CONFIG_LOCATION_PROPERTY(spring.config.location)是否存在配置,无则走默认配置路径DEFAULT_SEARCH_LOCATIONS(classpath:/,classpath:/config/,file:./,file:./config/)然后遍历这四个目录下看是否存在application.properties/yml文件
names.forEach((name) -> load(location, name, profile, filterFactory, consumer)),names配置文件名称数组其实这里只有一个application(默认的配置文件名称),根据路径和名称进行配置文件的解析
![](https://img.haomeiwen.com/i7277612/1e631febc030e122.png)
这里的PropertySourceLoanders其实是在new Loader构建实例的时候设置的,也就是读取spring.factories文件配置中的PropertiesPropertySourceLoader和YamlPropertySourceLoader分别对properties和yaml文件的解析
![](https://img.haomeiwen.com/i7277612/3fa40c03822f27fb.png)
![](https://img.haomeiwen.com/i7277612/ec03cfa3c2469058.png)
两者覆写的load方法实现如何处理资源为PropertySource对象。
获取完文件后缀后调用loadIntoGroup方法将资源信息转化为PropertySource,其实质为调用PropertySourcesLoader中load方法
最后调用addConfigurationProperties(this.propertiesLoader.getPropertySources())方法将解析过后的资源信息放置进Enviroment中propertySources属性集合中