代码改变世界

ConfigurationProperties原理

2024-01-19 18:03  Spiderman25  阅读(44)  评论(0)    收藏  举报
registerBeanDefinition:979, DefaultListableBeanFactory (org.springframework.beans.factory.support)
register:131, ConfigurationPropertiesBindingPostProcessor (org.springframework.boot.context.properties)
registerInfrastructureBeans:51, EnableConfigurationPropertiesRegistrar (org.springframework.boot.context.properties)
registerBeanDefinitions:38, EnableConfigurationPropertiesRegistrar (org.springframework.boot.context.properties)
registerBeanDefinitions:86, ImportBeanDefinitionRegistrar (org.springframework.context.annotation)
lambda$loadBeanDefinitionsFromRegistrars$1:384, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
accept:-1, 1788380050 (org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$$Lambda$342)
forEach:684, LinkedHashMap (java.util)
loadBeanDefinitionsFromRegistrars:383, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitionsForConfigurationClass:148, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
loadBeanDefinitions:120, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation)
processConfigBeanDefinitions:331, ConfigurationClassPostProcessor (org.springframework.context.annotation)
postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation)
invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support)
invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support)
refresh:533, AbstractApplicationContext (org.springframework.context.support)
refresh:141, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:757, SpringApplication (org.springframework.boot)
refreshContext:397, SpringApplication (org.springframework.boot)
run:317, SpringApplication (org.springframework.boot)
run:1265, SpringApplication (org.springframework.boot)
run:1253, SpringApplication (org.springframework.boot)
main:17, AppApplication (org.springframework.boot.mytest)

 一句话,就是被ConfigurationPropertiesBindingPostProcessor处理后就能自动添加属性了

在调用beanfactory的回调方法时,在工厂bean ConfigurationClassPostProcessor这个类中会被回调,解析Import导入的类时,会调用EnableConfigurationPropertiesRegistrar这个类的registerBeanDefinitions方法,该方法会调用ConfigurationPropertiesBindingPostProcessor的静态方法register把ConfigurationPropertiesBindingPostProcessor定义注册到容器中。

而EnableConfigurationPropertiesRegistrar是在EnableConfigurationProperties类中被导入

 

 至于在哪又添加了EnableConfigurationProperties,这个我还没有看到。

setVv:16, Mybean (org.springframework.boot.mytest.vv)
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
setValue:346, JavaBeanBinder$BeanProperty (org.springframework.boot.context.properties.bind)
bind:96, JavaBeanBinder (org.springframework.boot.context.properties.bind)
bind:79, JavaBeanBinder (org.springframework.boot.context.properties.bind)
bind:56, JavaBeanBinder (org.springframework.boot.context.properties.bind)
lambda$bindDataObject$5:452, Binder (org.springframework.boot.context.properties.bind)
get:-1, 1046545660 (org.springframework.boot.context.properties.bind.Binder$$Lambda$191)
withIncreasedDepth:572, Binder$Context (org.springframework.boot.context.properties.bind)
withDataObject:558, Binder$Context (org.springframework.boot.context.properties.bind)
access$400:513, Binder$Context (org.springframework.boot.context.properties.bind)
bindDataObject:450, Binder (org.springframework.boot.context.properties.bind)
bindObject:391, Binder (org.springframework.boot.context.properties.bind)
bind:320, Binder (org.springframework.boot.context.properties.bind)
bind:308, Binder (org.springframework.boot.context.properties.bind)
bind:238, Binder (org.springframework.boot.context.properties.bind)
bind:225, Binder (org.springframework.boot.context.properties.bind)
bind:89, ConfigurationPropertiesBinder (org.springframework.boot.context.properties)
bind:107, ConfigurationPropertiesBindingPostProcessor (org.springframework.boot.context.properties)
postProcessBeforeInitialization:96, ConfigurationPropertiesBindingPostProcessor (org.springframework.boot.context.properties)
applyBeanPostProcessorsBeforeInitialization:415, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1786, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 938463537 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$267)
getSingleton:226, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
refresh:141, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:757, SpringApplication (org.springframework.boot)
refreshContext:397, SpringApplication (org.springframework.boot)
run:317, SpringApplication (org.springframework.boot)
run:1265, SpringApplication (org.springframework.boot)
run:1253, SpringApplication (org.springframework.boot)
main:17, AppApplication (org.springframework.boot.mytest)

 doCreateBean方法

 

 

 

 ConfigurationPropertiesBindingPostProcessor

 

 

 

 

 

 

 

 


 

ConfigurationPropertiesBindingPostProcessor这个类在处理bean对象时会判断是否被ConfigurationProperties标记,如果没有则不处理,最后使用Binder类来处理属性绑定。Binder可以认为是一个工具类,其原理利用反射,遍历每个属性,然后从propertySources中取值再设置到属性中。