Spring Bean定义扫描
2020-11-18 20:10:36 0 举报
Spring Bean定义扫描
作者其他创作
大纲/内容
@Bean
解析bean定义入口
PriorityOrdered
ClassPathBeanDefinitionScanner#registerBeanDefinition
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors()
bean定义解析结束
BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry()
AbstractApplicationContext#invokeBeanFactoryPostProcessors()
ConfigurationClassParser#processImports
实现了importSelector接口的子接口DeferredImportSelector的,先实例化对象放在本次解析的配置类list集合deferredImportSelectors中,稍后延时在ConfigurationClassParser#processDeferredImportSelectors处理,同样也是调用selectImport方法
nonOrdered没有实现order接口
invokeBeanDefinitionRegistryPostProcessors
实现了BeanFactoryPostProcessor
调用完成系统内部ConfigurationClassPostProcessor后置处理的postProcessBeanDefinitionRegistry()方法解析完成bean定义并向bean定义容器中注册后,才调用BeanFactoryPostProcessor接口的postProcessBeanFactory方法。可以在这个方法中对bean定义进行修改
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry()
Spring Bean 定义扫描
获取系统内部实现BeanDefinitionRegistryPostProcessor接口的后置处理器ConfigurationClassPostProcessor
@PropertySource
将ConfigurationClass包装成SourceClass对象, do while循环调用解析配置类,如果配置类继承了某个类,则也会解析到这个父类,但不会解析包路径带有java开头的父类,如java.lang.object
文本
selectImports()
调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类postProcessBeanDefinitionRegistry方法
开始
获取到配置类中所有使用@Bean标记的方法,放在配置类的一个set集合beanMethods中,稍后再loadBeanDefinitions中处理
getBeanFactoryPostProcessors()
配置类的解析顺序
获取配置类上Import导入的类
将ConfigurationClassParser解析器的configurationClasses中的配置类作为参数传入将@Import、@Bean等注册到bean定义容器中
DefaultListableBeanFactory#registerBeanDefinition
@Import
@ImportResource
遍历调用我们自个定义的BeanDefinitionRegistryPostProcessor后置处理器的postProcessBeanDefinitionRegistry()方法
do while循环逐个调用解析配置类
获取我们自个添加的实现BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor接口后置处理器
BeanFactoryPostProcessor#postProcessBeanFactory
将我们传进来的配置类包装成一个ConfigurationClass对象
AbstractApplicationContext#refresh()
在parse解析完成之后调用,主要是处理@Import和@Bean
对于普通的类,先放在继承了Map接口MultiValueMap接口容器imports中,并将改类作为配置类进行再次解析font color=\"#ff3333\
ClassPathBeanDefinitionScanner#doScan
ConfigurationClassBeanDefinitionReader#loadBeanDefinitions
1、判断自身是否是Import导入的,如果是就调用ConfigurationClassBeanDefinitionReader#registerBeanDefinitionForImportedConfigurationClass方法把自己注册到bean容器中。2、将@Bean注解加入到bean定义容器中。3、处理@ImportResource.4、处理实现的ImportBeanDefinitionRegistrar接口的
processConfigBeanDefinitions(registry);
实现了ImportBeanDefinitionRegistrar接口的同样先实例化对象放在Map集合importBeanDefinitionRegistrars中稍后在loadBeanDefinitions中处理
Ordered
ComponentScanAnnotationParser#parse
ConfigurationClassParser#parse(java.util.Set<org.springframework.beans.factory.config.BeanDefinitionHolder>)
查找我们beanFactory的Bean定义容器中的配置类,创建我们的配置类解析器ConfigurationClassParser
@ComponentScan
invokeBeanFactoryPostProcessors
实现了BeanDefinitionRegistryPostProcessor
收藏
0 条评论
回复 删除
下一页