第20集 refresh()-invokeBeanFactoryPostProcessor 四-处理@Configuration下的@Bean生成代理对象
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、二行InvokeBeanFactoryPostProcessors的作用
registryProcessors:处理的是手动添加和自动注解
regularPostProcessors:在这里的话 只会处理手动添加的 不会处理非注解添加的。
其实正常情况下是 只会调用ConfiguraitonClassPostProcessor的postProcessBeanFactory
2、为什么要对@Configuration修饰的配置bean创建代理?为啥两个user一样?
1、因为要获取Spring中所有以@Configuration注解所修饰的@Bean
2、把配置@Bean的BeanDefinition进行替换,替换成代理类型这样可以根据@Bean的配置去生成对应的BeanDefinition。
3、InvokeBeanFactoryPostProcessors到底创建对象了吗
没有,创建对象是在后面,这里只是处理@Configuration下的@Bean
4、ImportAwareBeanPostProcessor的作用
作用:可以获取@Configuration下的@Import的A类,importMetadata就是A.class。
5、为啥其他BeanPostProcessor是在this()创建Reader的时候创建的?而ImportAwareBeanPostProcessor是在这个地方呢?
ConfigurationClassPostProcessor对相应@Import类进行了解析,所以对@Import也放在了这个里面来处理。
前面把@import都处理完了,在ImportAwareBeanPostProcessor这个地方会更加安全,因为它已经知道@Import已经处理完了。
6、总结
- 主要讲了两个InvokeBeanFatoryPostProcessor的作用,其实正常情况下你不手动添加或者注解添加BeanFactoryPostProcessor一般只会调用ConfiguraitonClassPostProcessor的postProcessBeanFactory
- 第一个invokeBeanFactoryPostProcessors:处理的处理的是registryProcessors手动添加的和注解添加的BeanFactoryPostProcessor以及它的子接口BeanDefinitionRegistryPostProcessor
- 第二个invokeBeanFactoryPostProcessors:在这里的话 只会处理regularPostProcessors意思就是手动添加的BeanFactoryPostProcessor不会处理非注解添加的。
- 什么是手动添加的?
- 其实正常情况下是 只会调用ConfiguraitonClassPostProcessor的postProcessBeanFactory
- 接下来就是 找到@Configuartion下的所有@Bean,
- 接着就是使用Cglib生成代理
- 这就是为什么@Bean里面明明是new的,但是获取多次还是同一个对象的原因。