springboot加载自定义properties原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot加载自定义properties原理相关的知识,希望对你有一定的参考价值。

参考技术A springboot自定义属性文件通过value注解引入,和@autowired不同的是,它是由ConfigurationClassPostProcessor这个BeanDefinitionRegistryPostProcessor来处理,属性文件的读取和注入是在BeanDefinition级别,对象实例化之前。

我们建一个简单的类的梳理一下。

调用堆栈 从refresh开始,主要走了这几个方法:
invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors
ConfigurationClassPostProcessor->processConfigBeanDefinitions
ConfigurationClassParser->doProcessConfigurationClass
ConfigurationClassParser->processPropertySource
ConfigurationClassParser->addPropertySource

ConfigurationClassParser主要方法:
doProcessConfigurationClass->processPropertySource->addPropertySource

逻辑主要集中在doProcessConfigurationClass方法
doProcessConfigurationClass负责解析@PropertySource,@Import annotations,@ComponentScan等注解 。
1 调用processPropertySource处理自身的propertySource
2 扫描类上的ComponentScan,对扫出的类继续调用parse
3 处理@Import annotations等其他标签

processPropertySource结构很简单:
1根据注解里的location属性载入配置文件
2调用addPropertySource处理每个属性文件

addPropertySource这个类才是真正处理@value属性:
1把用户定义的properties文件加到Eniverment中去
2如果有相同name的属性文件,需要合并

CompositePropertySource 的场景其实是你有两个不同的文件,但是 @PropertySource中设置同样的name属性,这样CompositePropertySource 会做一个合并,按加入的时间顺序取。

增加一个product2,PropertySource name都设置为myprod

debug到addPropertySource,newSource和existing已经不一样了。
environment的propertySources里也有两份文件了。

以上是关于springboot加载自定义properties原理的主要内容,如果未能解决你的问题,请参考以下文章

java web项目启动时自动加载自定义properties文件

SpringBoot:@ConfigurationProperties配置参数绑定

161216使用spring的DefaultResourceLoader自定义properties文件加载工具类

android自定义serviceloader接口隔离及获取自定义properties参数配置

SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件

SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件