一、spring内置的BeanDefinitionRegistryPostProcessor及其作用

何为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的类分为三种类型:

  1. 一般的普通类
  2. ImportSelector接口的子类
  3. ImportBeanDefinitionRegistrar接口的子类

2、ConfigurationClassPostProcessor#postProcessBeanFactory

    对加了@Configuration的类进行动态代理; 向BeanFactory中添加一个ImportAwareBeanPostProcessor
经验分享 程序员 微信小程序 职场和发展