invokeBeanFactoryPostProcessors
2021-01-11 11:49:42 0 举报
spring源码 invokeBeanFactoryPostProcessors
作者其他创作
大纲/内容
registerBeanDefinitionfont color=\"#ff8000\
DeferredImportSelector.getImportGroup()该扩展方法的返回值决定后续走向
IOC
BeanDefinitionRegistry
并且实现了PriorityOrdered接口
@注解
deferredImportSelectors.add()
candidates
BeanDefinitionMap
deferredImports.sort排序
AnnotionConfigApplicationContext
getBean
selectImports
BeanFactoryPostProcessor
ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
ConfigurationClassImportBeanDefinitionRegistrar.put
①解析配置类
调用自定义的实现了FactoryRegistryPostProcessor接口
得到当前配置类下所有@Bean方法beanMethods = retrieveBeanMethodMetadata
return null
selector.selectImports()调用方法返回字符串数组asSourceClasses反射为Class循环处理
AbstractApplicationContext#invokeBeanFactoryPostProcessors(beanFactory);
ImportBeanDefinitionRegistrar
2.创建配置类解析器解析 @ComponentScan @Import@Bean @ImportResource
selector instanceof DeferredImportSelector是否实现接口
ClassPathScanningCandidateComponentProvider#scanCandidateComponents()
importBeanDefinitionRegistrars
forEach
ImportSelector
ConfigurationClassParser#processImports()
font color=\"#a1a1a1\
加载BD
else
AutoConfigurationGroup implements Group
candidateNames
for
importCandidates
configClass当做配置类
postProcessors-->就一个ConfigurationClassPostProcessor
Loop
解析@ImportResource
ClassPathXmlApplicationContext
判断是否符合候选组件要求
注册
@Bean-beanMethods
2
此处只把所有@Bean方法读取出来add到Set中,并未解析成BeanDefinition
isCandidateComponent
候选的BeanDefinition
调用实现了BeanFactoryPostProcessor接口
processConfigBeanDefinitions(registry);
basePackages
AutoConfigurationGroup.process
会在解析完配置后调用processDeferredImportSelectors()解析
getBeanFactoryPostProcessors()返回null,该beanFactoryPostProcessor,需要我们手动设置
processPropertySource(propertySource);解析属性资源文件@PropertySource
获得包下面所有的.claa文件
@ImportResources不重要不说了
解析@Import
invokeBeanFactoryPostProcessors
else if
configClass.get(BeanMethods())
此处小细节:会调用ConfigurationClassPostProcessor的postProcessBeanFactory方法将配置类创建CGLIB代理只有full版配置类才会创建chlib代理 虽然我们在指定配置的时候不标注@Configuration也行,所以加不加注解的区别就在这里 那么加了@Configuration和不加在本质上有什么区别? 当在配置类中一个@Bean使用方法的方式引用另一个Bean,如果不加注解就会重复加载Bean 如果加了@Configuration 则会在这里创建cglib代理,当调用@Bean方法时,会先检测容器中是否存在
在这里把之前添加的BeanMethod开始注册为Bean定义-
currentRegistryProcessors.add(beanFactory.getBean());创建Bean,然后存入到集合中
PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
会在这里解析
asConfigClass(ConfigurationClass importedBy)new一个ConfigClass使用ImportedBy标记是从哪个配置类中的@Import进来的
解析@ComponentScan
return
XML
processDeferredImportSelectors()
到此为止所有实现了FactoryRegistryPostProcessor接口的都调用完毕,最主要的工作还是调用了内置ConfigurationClassPostProcessor扫描了Bean定义,和调用自定义的FactoryRegistryPostProcessor注册Bean定义
getImportGroup
ClassPathBeanDefinitionScanner#doScan(String... basePackages)
BeanFactory
SpringBoot逻辑
font color=\"#b8b8b8\
用来扫描我们classpath下的标注了@Service @Compent@Respository @Controller
填充属性@Autowired @Value
在这里把之前@Import导入的普通类注册为Bean定义
@Import-ImportBeanDefinitionRegistrar
循环处理所有自动配置类
在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScans注解扫描的包,以及解析@Import等注解
Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
@Bean和@Import的BeanDefinition在此处注册
currentRegistryProcessors.clear();
groupsDeferredImportSelectorGrouping
PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
postProcessor -->就一个ConfigurationClassPostProcessor
@Import-ImportedBy
DefaultDefeeredImportSelectorGroup.process
refresh()
bean
符合
1
ScannedGenericBeanDefinition注册到BeanDefinitionMap中@ComponentScan的扫描算是完成了
3
Resource
ComponentScanAnnotationParser#parse
BeanDefinitionRegistryPostProcessor
调用自定义的实现了FactoryRegistryPostProcessor接口和实现了Order接口的
configClass.isImported()从@Import导入的
解析配置类
在这里把之前添加的BeanMethod开始注册为Bean定义
scanner = new ClassPathBeanDefinitionScanner
初始化initMethod destroy
解析我们的配置类
注册bean定义
调用创世纪的后置处理器实现了BeanDefinitionRegisterPostProcessor接口和Order接口
getImports(sourceClass)获得当前配置类的@Import注解的导入类
循环找出遗漏未解析的配置类
这里只是把ImportBeanDefinitionRegistrar实例缓存起来
ConfigurationClass#addBeanMethod()Set<MethodMetadata>
排序
并且实现了Ordered接口
找到候选的BeanDefinitionfindCandidateComponents
递归处理直到处理为 else configClass
实例化反射
getAutoConfigurationEntry() 获取所有自动装配类
接口
事件
createGroup()DefaultDeferredImportSelectorGroup
调用自定义的实现了FactoryRegistryPostProcessor接口.postProcessBeanFactory方法
类
getImports()
AutoConfigurationImportSelector implements DeferredImportSelector
new ConfigurationClassParser
将@ComponetScan的信息存到scannerexcludeFilters includeFiltersScopeProxyMode lazyInit ...
BeanDefinitionReader
加载已经注册的Bean定义的后置处理器也就是之前注册的:this.reader = new AnnotatedBeanDefinitionReader(this); 和注册的配置类从里面找到实现了BeanDefinitionRegistryPostProcessor接口的,也就是我们的ConfigurationClassPostProcessor
process()
没实现普通的ImportSelector
!candidates.isEmpty()
do
这里是一条分支,将配置的class注册Bean定义:ConfigurationClassPostProcessor
抽象
excludeFilters
includeFilters
没有实现任何的优先级接口
this.reader.loadBeanDefinitions(configClasses);
ConfigurationClassBeanDefinitionReader#loadBeanDefinitions()
BeanDefinition
font color=\"#009900\
经过一些列的解析(scope、lazy、DependsOn等)
ConfigurationClassParser#parse()
循环从所有BeanDefinition拿到配置类并且标记:CONFIGURATION_CLASS_ATTRIBUTE属性分2种:1.full完成配置类:@Configuration2.lite精简版配置类:@Component @ComponentScan@ImportResource @Bean
实现了延时ImportSelector
aware
BeanDefinitionScanner
解析@Bean
是1
再次当做配置类解析,如果不是配置类最终会当做普通Bean定义注册
...
修改
0 条评论
回复 删除
下一页