Spring的后置處理器BeanPostProcessor


一、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"'。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM