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