ConfigurationClassPostProcessor
2021-08-10 15:37:23 0 举报
ConfigurationClassPostProcessor加载解析BeanDefintion执行流程
作者其他创作
大纲/内容
this.deferredImportSelectorHandler.process()
将deferredImportSelectorHandler所有的DeferredImportSelector注册到新建类Handler上
DeferredImportSelectorGroupingHandler.processGroupImports从group中获取导入的类信息,并当作Import进行处理
ConfigurationClassPostProcessor
ConfigurationClassParser。parse(Set<BeanDefinitionHolder> configCandidates)
解析完之后
parse方法会根据参数创建ConfigurationClass调并调用ProcessConfigurationClass方法
否
deferredImportSelectorHandler意思是延迟的导入处理器,当我们通过@Import的注解导入ImportSelector类型的类时,如果实现的时ImportSelector接口的子类DeferredImportSelector,就会将其放入到this.deferredImportSelectorHandler.中
调用ClasspathBeanDefinitionScanner的doScan(String... basePackages)
遍历每个importCandidate即@Import导入的类
doProcessConfigurationClass方法
新建一个DeferredImportSelectorGroupingHandler类
将selector添加到deferredImportSelectorHandler中( ConfigurationClassParser的属性)
postProcessBeanDefinitionRegistry
新建一个ConfigurationClassBeanDefinitionReader类。从之前ConfigurationClassParser中获取到解析到的configClasses
ImportSelector类
处理@ComponentScan annotations
获取到@ComponentScan的属性信息
Process individual @Bean methods。找出所有的@Bean修饰的方法并放入configclass的属性中
ImportBeanDefinitionRegistrar类
将ImportSelector返回的类名数组封装为SourceClass集合调用自己
调用selector.selectImports(AnnotationMetadata importingClassMetadata)方法,获取想要导入的类的名称数组
ImportSelector又分为两种类型
registerBeanDefinitionForImportedConfigurationClass(configClass)所有的通过@import被导入的类,其对应的configClass还未被注册到Spring中,在此处被注册
普通ImportSelector
reader.loadBeanDefinitions(configClasses)
从beanDefintions中找出配置类,交给ConfigurationClassParser解析
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources());
实例化ImportBeanDefinitionRegistrar将其放入configClass中的importBeanDefinitionRegistrars属性中
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())//依次执行ImportBeanDefinitionRegistrar的registerBeanDefinitions方法
DeferredImportSelector
最后将configClass放入到configurationClasses集合中
创建ClassPathBeanDefinitionScanner对象,根据componentScan设置basePackage等查询条件
根据basePackage扫描并创建出BeanDefiniton
for (BeanMethod beanMethod : configClass.getBeanMethods()) { loadBeanDefinitionsForBeanMethod(beanMethod); }遍历configclass中@bean修饰的方法,为每个方法建立一个beanDefintion,并注册到spring中
依次遍历每个configCandidate
将每个BeanDefinition返回
普通类
是否遍历完成
处理@PropertySource annotations
调用ProcessImports方法:importCandidates为类上Import注解所有如的所有类
importCandidate三种类型
被当作@Configuration修饰的配置类来处理
将ConfigurationClass转换为sourceClass
注册一个ImportRegistry,为了支持ImportAware接口
processConfigBeanDefinitions
将每个扫描出来的BeanDefinition注册到spring中
End
0 条评论
下一页
为你推荐
查看更多