SpringBean注册之@Configuration配置类解析过程
2022-03-14 13:03:43 5 举报
SpringBean注册之@Configuration配置类解析过程
作者其他创作
大纲/内容
this.reader.loadBeanDefinitions(configClasses)
执行ImportBeanDefinitionRegistrar的registerBeanDefinitions()方法注册Bean定义信息
处理单个@Bean方法,把他们封装成BeanMethod对象放在缓存池中
selector.selectImports(currentSourceClass.getMetadata())
postProcessBeanFactory()
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources())
processPropertySource(propertySource)
1、验证 如果是配置类,那么不能是final,因为他要进行继承代理2、@Bean标注的方法不能是private final的,3、注意方法可以是static的,虽然static方法不能被重写,但是他可以被继承4、尽量不要是static方法,因为CGLIB代理不能重写static方法。
处理任何@ImportResource注释
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory))
执行所有@Bean标注的方法
invokeBeanFactoryPostProcessors(beanFactory)
parser.validate()
registerBeanDefinitionForImportedConfigurationClass(configClass)
执行所有不是DeferredImportSelector的ImportSelector的selectImports()方法
注册@importedResources进来的bean
ConfigurationClassPostProcessor,他是一个BeanDefinitionRegistryPostProcessor
this.deferredImportSelectorHandler.process()
这里扫描到的Bean定义,就直接register注册了。所以它的时机是非常早的。(另外:如果注册进去的Bean定义信息如果还是配置类,这里会继续parse())
处理任何@Import注释
把当前ImportBeanDefinitionRegistrar对象缓存起来
执行所有缓存的DeferredImportSelector
postProcessBeanDefinitionRegistry()
生成解析@Configuration的类ConfigurationClassParser
processConfigurationClass(candidate.asConfigClass(configClass))
把当前DeferredImportSelector包装成DeferredImportSelectorHolder对象储存到缓存中
enhanceConfigurationClasses(beanFactory)
先解析内部类
循环解析所有配置类
入口
this.reader = new ConfigurationClassBeanDefinitionReader(XX)
处理@ComponentScan注解
parser.parse(candidates)
loadBeanDefinitionsForBeanMethod(beanMethod)
loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())
候选类不是ImportSelector或ImportBeanDefinitionRegistrar将其作为@Configuration类处理
processConfigBeanDefinitions(registry)
ConfigurationClassParser parser = new ConfigurationClassParser(XX)
处理@PropertySource注解
注册那些使用@Imported注入的普通类
ConfigurationClassPostProcessor
一阶段解析:循环解析配置类
0 条评论
下一页