一、BeanPostProcessor接口的作用
如果我們需要在Spring容器完成Bean的實例化、配置和其他的初始化前后添加一些自己的邏輯處理,我們就可以定義一個或者多個BeanPostProcessor接口的實現,然后注冊到容器中去。
二、如何實現BeanPostProcessor接口
BeanPostProcessor有兩個方法需要實現:postProcessorAfterInitialization、postProcessorBeforeInitialization。
Java代碼:
import org.springframework.beans.factory.config.BeanPostProcessor; public class TestBeanPostProcessor implements BeanPostProcessor { /** * 實例化之后進行處理 */ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * 實例化之前進行處理 */ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } }
前者在初始化代碼調用之后調用。
后者在實例化及依賴注入完成后,在任何初始化代碼(比如配置文件中的init-method)調用之前調用。
三、BeanFactory和ApplicationContext對待bean后置處理器稍有不同
1. ApplicationContext會自動檢測在配置文件中實現了BeanPostProcessor接口的所有bean。並把他們注冊為后置處理器,然后在容器創建bean的適當時候調用它。因此部署一個后置處理器同部署其他bean並沒有什么區別。
<bean class="TestBeanPostProcessor" />
2. 而使用BeanFactory實現的時候,bean后置處理器必須通過代碼顯式的去注冊,在IOC容器集成體系中ConfingurableBeanFactory接口中定義了注冊方法。
例如:
TestBeanPostPrcessor beanPostProcessor = new TestBeanPostPrcessor(); Resource resource = new FileSystemResource("applicationContext.xml"); ConfigurableBeanFactory factory = new XmlBeanFactory(resource); factory.addBeanPostProcessor(beanPostProcessor); factory.getBean("logic");
注意:
1. 接口中的兩個方法都要將傳入的bean返回、而不能返回Null。否則getBean將無法取得目標。
2. 如將BeanPostProcessor標記為延遲初始化,則無法注冊,自定義邏輯也就無法得到應用。假如你在<beans/>元素的定義中使用了'default-lazy-init'屬性,則各個BeanPostProcessor需標記為'lazy-init="false"'。
