Spring提供了两种PostProcessor(后置处理)bean的扩展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor
1.BeanFactoryPostProcessor:是针对于beanFactory的扩展点,即spring会在beanFactory初始化之后,beanDefinition都已经loaded,但是bean还未创建前进行调用,可以修改,增加beanDefinition
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}
此接口只提供了一个方法,方法参数为ConfigurableListableBeanFactory
2.BeanPostProcessor:是针对bean的扩展点,即spring会在bean初始化前后 调用方法对bean进行处理
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
}
接口提供了两个方法,分别是初始化前和初始化后执行方法,如果定义一个类实现了BeanPostProcessor,默认是会对整个Spring容器中所有的bean进行处理。
可以根据第二个参数beanName 来确认我们将要处理的具体的bean。
这个的处理是发生在Spring容器的实例化和依赖注入之后。
在bean实例化之前,首先执行BeanFactoryPostProcessor实现类的方法,然后通过调用bean的无参构造函数实例化bean,并调用set方法注入属性值。bean实例化后,执行初始化操作,调用两个初始化方法(两个初始化方法的顺序:先执行afterPropertiesSet,再执行init-method)前后,执行了BeanPostProcessor实现类的两个方法
3.BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口:是针对于beanFactory的扩展点,即spring会在调用BeanFactoryPostProcessor之前调用他。
4.InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口:是针对于bean的扩展点,即spring会在bean实例化前后进行调用
5.SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor的子接口:是针对于bean的扩展点,预测已处理bean的最终类型,或者觉得bean实例化需要的构造函数,或者获取早期的bean
6.MergedBeanDefinitionPostProcessor是BeanPostProcessor的子接口:是针对于bean的扩展点,即spring会处理某个给定的beanDefinition于原本的bean进行merged