何为BeanDefinitionRegistryPostProcessor?
BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的拓展接口
☆ConfigurationClassPostProcessor
ConfigurationClassPostProcessor这个类何时被加载到Spring容器中?
实例化AnnotationConfigApplicationContext中的AnnotatedBeanDefinitionReader时,将ConfigurationClassPostProcessor封装成BeanDefinition,放入到BeanFactory中。
ConfigurationClassPostProcessor何时被初始化?
ConfigurationClassPostProcessor何时被执行?
会先执行
后执行
为什么会先执行postProcessBeanDefinitionRegistry()方法,再执行postProcessBeanFactory()方法?
ConfigurationClassPostProcessor的两个方法都做了什么工作?
1、ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
对加了@Configuration注解的类的进行解析。获取@PropertySource、@ComponentScan、@ImportResource、@Import等注解,根据这些注解完成特定工作。
- 解析@ComponentScan注解中的包路径,扫描包路径下有@Component的类,以及在@Configuration中定义的@Bean,
将这些类封装成BeanDefinition,放入到BeanFactory中。
@Component有很多子注解,它们是:@Configuration、@Controller、@Service、@Repository,也可以自定义注解。
- 解析@ImportResource可以解析xml文件。
- 解析@Import,@Import是Spring中很重要的一个拓展点。
@Import的类分为三种类型:
- 一般的普通类
- ImportSelector接口的子类
- ImportBeanDefinitionRegistrar接口的子类
2、ConfigurationClassPostProcessor#postProcessBeanFactory
- 对加了@Configuration的类进行动态代理;
- 向BeanFactory中添加一个ImportAwareBeanPostProcessor
下一篇 二、Spring内置的BeanFactoryPostProcessor及其作用