Spring 的 BeanPostProcessor接口實現
http://blog.csdn.net/chensugang/article/details/3423650
今天學習了一下Spring的BeanPostProcessor接口,該接口作用是:如果我們需要在Spring容器完成Bean的實例化,配置和其他的初始化後添加一些自己的邏輯處理,我們就可以定義一個或者多個BeanPostProcessor接口的實現。
下面我們來看一個簡單的例子:
package com.spring.test.di;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanPostPrcessorImpl implements BeanPostProcessor {
// Bean 實例化之前進行的處理
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("對象" + beanName + "開始實例化");
return bean;
}
// Bean 實例化之後進行的處理
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("對象" + beanName + "實例化完成");
return bean;
}
}
只要將這個BeanPostProcessor接口的實現定義到容器中就可以了,如下所示:
<bean class="com.spring.test.di.BeanPostPrcessorImpl"/>
測試代碼如下:
package com.spring.test.di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// 得到ApplicationContext對象
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"applicationContext.xml");
// 得到Bean
ctx.getBean("logic");
}
}
運行以上測試程序,可以看到控制臺打印結果:
對象logic開始實例化
對象logic實例化完成
BeanPostProcessor的作用域是容器級的,它只和所在容器有關。如果你在容器中定義了BeanPostProcessor,它僅僅對此容器中的bean進行後置。它不會對定義在另一個容器中的bean進行任何處理。
註意的一點:
BeanFactory
和ApplicationContext
對待bean後置處理器稍有不同。ApplicationContext
會自動檢測在配置文件中實現了BeanPostProcessor
接口的所有bean,並把它們註冊為後置處理器,然後在容器創建bean的適當時候調用它。部署一個後置處理器同部署其他的bean並沒有什麽區別。而使用BeanFactory
實現的時候,bean 後置處理器必須通過下面類似的代碼顯式地去註冊:
BeanPostPrcessorImpl beanPostProcessor = new BeanPostPrcessorImpl();
Resource resource = new FileSystemResource("applicationContext.xml");
ConfigurableBeanFactory factory = new XmlBeanFactory(resource);
factory.addBeanPostProcessor(beanPostProcessor);
factory.getBean("logic");
Spring 的 BeanPostProcessor接口實現