1. BeanPostProcessor簡介
BeanPostProcessor是Spring IOC容器給我們提供的一個擴展接口。接口聲明如下:
public interface BeanPostProcessor { //bean初始化方法調用前被調用 Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException; //bean初始化方法調用后被調用 Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; }
運行順序
===Spring IOC容器實例化Bean===
===調用BeanPostProcessor的postProcessBeforeInitialization方法===
===調用bean實例的初始化方法===
===調用BeanPostProcessor的postProcessAfterInitialization方法===
不要將BeanPostProcessor標記為延遲初始化。因為如果這樣做,Spring容器將不會注冊它們,自定義邏輯也就無法得到應用。假如你在<beans />元素的定義中使用了'default-lazy-init'屬性,請確信你的各個BeanPostProcessor標記為'lazy-init="false"'。BeanFactory和ApplicationContext對待bean后置處理器稍有不同。ApplicationContext會自動檢測在配置文件中實現了BeanPostProcessor接口的所有bean,並把它們注冊為后置處理器,然后在容器創建bean的適當時候調用它,因此部署一個后置處理器同部署其他的bean並沒有什么區別。而使用BeanFactory實現的時候,bean 后置處理器必須通過代碼顯式地去注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法
2. BeanPostProcessor實例
public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean); return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean); return bean; } }
3.InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外兩個時期提供擴展的回調接口,即實例化Bean之前(調用postProcessBeforeInstantiation方法)和實例化Bean之后(調用postProcessAfterInstantiation方法),該接口定義如下:
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException; boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException; PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException; }
其使用方法與上面介紹的BeanPostProcessor接口類似,只時回調時機不同。
3. BeanFactoryPostProcessor簡介
bean工廠的bean屬性處理容器,說通俗一些就是可以管理我們的bean工廠內所有的beandefinition(未實例化)數據,可以隨心所欲的修改屬性。
4. BeanFactoryPostProcessor實例
@Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory..."); int count = beanFactory.getBeanDefinitionCount(); String[] names = beanFactory.getBeanDefinitionNames(); System.out.println("當前BeanFactory中有"+count+" 個Bean"); System.out.println(Arrays.asList(names)); } }
區別:
注冊BeanFactoryPostProcessor的實例,需要重載
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
通過beanFactory可以獲取bean的示例或定義等。同時可以修改bean的屬性,這是和BeanPostProcessor最大的區別。

