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原理的主要内容,如果未能解决你的问题,请参考以下文章
14-springboot-自定义properties文件值注入javaBean中