1 是什么
是一种干预Bean工厂(DefaultListableBeanFactory)初始化过程的处理器,Bean工厂的初始化包括Bean工厂的属性设置,以及每一个Bean对应的BeanDefinition对象的实例化和初始化,代理的完成等等。
2 两个顶级接口
2.1 BeanFactoryPostProcessor
只有一个方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
一般来说扩展Spring的话只要实现BeanFactoryPostProcessor就可以了,
获取获取到BeanFactory对象,在Spring容器初始化的过程中向BeanFactory中添加,删除,修改Bean。
该接口实现类执行时机:
在扫描之后,Bean实例化之前执行。Spring容器在初始化过程中会调用实现了BeanDefinitionRegistryPostProcessor接口实现类之后,再去调用实现BeanFactoryPostProcessor接口实现类。
当存在多个BeanFactoryPostProcessor实现类时,他们之间postProcessBeanFactory()方法的调用顺序是:
1.先调用容器.addBeanFactoryPostProcessor()添加的BeanFactoryPostProcessor实现类
2.再调用实现了PriorityOrdered接口的BeanFactoryPostProcessor实现类
3.再调用实现了Ordered接口的BeanFactoryPostProcessor实现类
4.最后调用其他的BeanFactoryPostProcessor实现类
2.2 BeanDefinitionRegistryPostProcessor
对BeanFactoryPostProcessor接口的增强,添加了另外一个方法:
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
一般不会利用该接口对spring进行扩展,除非想要在完成扫描之前完成某些功能。
该接口实现类执行时机:
和扫描同阶段执行,Spring容器在初始化过程中会先调用实现了BeanDefinitionRegistryPostProcessor接口实现类。
当存在多个BeanDefinitionRegistryPostProcessor实现类时,他们之间postProcessBeanDefinitionRegistry()方法的调用顺序是:
1.先调用容器.addBeanFactoryPostProcessor()添加的BeanDefinitionRegistryPostProcessor实现类
2.再调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类
3.再调用实现了Ordered接口的BeanDefinitionRegistryPostProcessor实现类
4.最后调用其他的BeanDefinitionRegistryPostProcessor实现类
当postProcessBeanDefinitionRegistry()调用完之后:
调用之前调用过的BeanDefinitionRegistryPostProcessor实现类的**postProcessBeanFactory()**方法
3 Spring内部Bean工厂后置处理器的实现
3.1 ConfigurationClassPostProcessor
spring最重要的Bean工厂处理器,实现了BeanDefinitionRegistryPostProcessor接口。
在postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)方法中完成解析和扫描,将Bean添加到BeanFactory中。
扫描处理的注解有:
@ComponentScan
@Import
@ImportResource
@Bean
在postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法完成了三件事:
1.对postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)的补充,判断未完成扫描的话完成扫描
2.完成对加了@Configuration注解进行cglib代理,生成对应的class对象
3.添加了工厂后置处理器(ImportAwareBeanPostProcessor)
3.2 EventListenerMethodProcessor
实现了BeanFactoryPostProcessor接口。
处理时间监听器Bean工厂后置处理器,找出了所有EventListenerFactory实现类并进行排序。