invokeBeanFactoryPostProcessors调用逻辑
2022-12-25 15:03:44 0 举报
invokeBeanFactoryPostProcessors调用逻辑
作者其他创作
大纲/内容
在初始化上下文时new ClassPathBeanDefinitionScanner会注册默认的includeFilters,其中就包含Component.class
候选的BeanDefinition
Loopcandidate
调用自定义的实现了BeanDefinitionRegistryPostProcessor和Ordered接口的
ConfigurationClassParser#parse
BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor
postProcessBeanFactory
自定义的MyBeanFactoryPostProcessor会被调用
加载已注册的bean定义的后置处理器也就是之前注册的this.reader = new AnnotatedBeanDefinitionReader(this);从里面找到实现了BeanDefinitionRegistryPostProcessor接口的也就是ConfigurationClassPostProcessor
candidateNames
Loop
这边会调用ConfigurationClassPostProcessor然后解析了配置类的时候,自定义的MyBeanFactoryPostProcessor会被注册到beanDefinitionMap中,因此这边自定义的不会被处理
调用自定义的实现了BeanDefinitionRegistryPostProcessor调用postProcessBeanFactory方法
循环所有BeanDefinition拿到配置类并且标记:CONFIGURATION_CLASS_ATTRIBUTE属性分两种:1.完整配置类@Configuration2.lite精简版配置类@Component,@ComponentScan,@ImportResource,@Bean
可以看出延迟加载Import和立即Import的解析时机不同延迟Import会在解析完@Configuration后解析,并且带排序和扩展逻辑,包括springboot
注册到BeanDefinitionMap中@ComponentScan算扫描完成
循环找出遗漏未解析的配置类
递归处理直到else configClass
else if
这里把之前@Import导入的ConfigurationClass注册为bean定义
invokeBeanFactoryPostProcessors
解析@Configuration
解析@ComponentScan
接口
1
ConfigurationClass#addBeanMethodSet<BeanMethod>
ComponentScanAnnotationParser#parse
Loop
即@ImportResources
创建配置类解析器,解析@Component,@ComponentScan,@ImportResource,@Bean
selector.selectImports()调用方法返回字符串数组asSourceClasses反射为Class循环处理
includeFilters
ConfigurationClassimportBeanDefinitionRegistrars.put
调用实现了BeanFactoryPostProcessor接口
processConfigBeanDefinitions
Loopresource
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
AbstractApplicationContext#invokeBeanFactoryPostProcessors
AutoConfigurationGroup implements Group
符合
@Import-ImportBeanDefinitionRegistrars
this.reader.loadBeanDefinitions(configClasses);
ConfigurationParse#REGISTER_BEAN
@Bean和@Import的BeanDefinition在此注册
PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
解析配置类
ClassPathBeanDefinitionScanner#doScan
调用顺序
refresh()
再次当做配置类解析,如果不是配置类最终会当成普通bean定义注册
ImportBeanDefinitionRegistrar
processPropertySource(propertySource)解析属性资源文件@PropertySource
currentRegistryProcessors.add(beanFactory.getBean()创建bean,加入到集合中
configClass当做配置类
configClass.isImported()是从@Import导入的
4
process()
找到候选BeanDefinitionfindCandidateComponents
会在解析完成后调用processDeferredImportSelector()解析
getImportGroup
ImportBeanDefinitionRegistrars
scanner = new ClassPathBeanDefinitionScanner
deferredImports.sort排序
importCandidates
即@Import的ImportBeanDefinitionRegistrars
BeanDefinitionRegistryPostProcessorPriorityOrdered
postProcessBeanDefinitionRegistry
this.deferredImportSelectorHandler.process();
isCandidateComponent
给配置类创建cglib动态代理
LoopbasePackages
new ConfigurationClassParser
selector instanceof DeferredImportSelector是否实现接口
loadBeanDefinitionsFromRegistrars
抽象
①解析配置类
ConfigurationClassBeanDefinitionReader#loadBeanDefinitions
解析@Bean
排序
3
没实现普通ImportSelector
getBeanFactoryPostProcessors()返回null,该beanFactoryPostProcessors需要我们手动设置
调用自定义的实现了BeanDefinitionRegistryPostProcessor
这里只是把ImportBeanDefinitionRegistrar实例缓存起来
SpringBoot逻辑AutoConfigurationImportSelector implements DeferredImportSelector
2
获取包下所有的.class文件
DeferredImportSelectorGrouping.getImportGroup()
解析@Import
return
BeanFactoryPostProcessorbean工厂的后置处理器
@Import-inportedBy
loadBeanDefinitionsForBeanMethod(beanMethod);
实现了延时ImportSelector
PostProcessors--就一个ConfigurationClassPostProcessor
这里把之前@Bean注册为bean定义
注册bean定义
ClassPathScanningCandidateComponentProvider#scanCandidateComponents
PostProcessorRegistrationDelegatefont color=\"#000000\
ImportSelector
BeanDefinitionRegistryPostProcessorOrdered
得到当前配置类下所有Bean方法beanMethods = retrieveBeanMethodMetadata(sourceClass)
Y
是1
实现了Ordered接口
BeanDefinitionRegistryPostProcessor带注册的bean工厂的后置处理器
这个类中会解析加了@Configuration注解的配置类,还会解析@ComponentScans扫描的包和解析@Import等注解
用来扫描我们classpath下标注了@Service,@Component,@Respositroy,@Controller的对象
这里只是把所有的Bean读出来Add到Set中,并没有解析成BeanDefinition
!candidates.isEmpty()
do
到目前为止所有实现了BeanDefinitionRegistryPostProcessor接口都调用完毕,主要工作是使用内置的ConfigurationClassPostProcessor扫描了bean定义和调用自定义的BeanDefinitionRegistryPostProcessor注册bean定义
deferredImportSelectors.add
asConfigClass(ConfigurationClass importedBy)new一个ConfigurationClass使用@ImportBy标记是从哪个配置类中@Import进来的
ConfigurationPhase#REGISTER_BEAN
getImports(sourceClass)获取当前配置类@Import注解的导入类
ConfigurationClassPostProcessor和MyBeanFactoryPostProcessor都会被调用
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
解析我们的配置类
实现了PriorityOrdered接口
ConfigurationClassParser#processImports
excludeFilters
BeanDefinitionRegistryPostProcessor
没有实现接口
ConfigurationPhase#PARSE_CONFIGURATION每一个@OnConditionalXXX都有不同的验证阶段
解析@ImportResource
loadBeanDefinitionsFromImportedResources()不是很重要
getAutoConfigurationEntry()获取所有自动装配类
将@ComponentScan的信息存储到scanner.includeFiltersexcludeFilterslazyInit
调用创世纪的实现了BeanDefinitionRegistryPostProcessor和PriorityOrdered接口的
Loop ConfigurationClass
else
currentRegistryProcessors.clear();
0 条评论
下一页