1. 程式人生 > 程式設計 >Spring系列六:Spring BeanPostProcessor

Spring系列六:Spring BeanPostProcessor

人如風後入江雲,情似雨餘黏地絮。

概述

bean後處理器允許自定義修改spring bean factory建立的新bean例項。如果你想在Spring容器完成例項化、配置和初始化bean之後實現一些定製邏輯,我們可以插入一個或多個BeanPostProcessor實現。

如果有多個BeanPostProcessor例項,我們可以通過設定order屬性或實現Ordered介面來控制執行順序。

Spring BeanPostProcessor

BeanPostProcessor介面由兩個回撥方法組成,即postprocessbeforeinitialize()postprocessafterinitialize()

對於由容器建立的每個bean例項,後處理器都會在呼叫容器初始化方法之前以及在任何bean初始化回撥之後都從容器獲得回撥。

bean後處理器通常檢查回撥介面,或者使用代理包裝bean。例如一些Spring AOP基礎結構類(例如AbstractAdvisingBeanPostProcessor)實現了bean後處理器,提供代理包裝邏輯。

如何建立BeanPostProcessor

spring中建立一個bean後處理器:

  1. 實現BeanPostProcessor介面。
  2. 實現回撥方法。
import org.springframework.beans.BeansException;
import
org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean,String beanName) throws BeansException { System.out.println("Called postProcessBeforeInitialization() for :"
+ beanName); return bean; } public Object postProcessAfterInitialization(Object bean,String beanName) throws BeansException { System.out.println("Called postProcessAfterInitialization() for :" + beanName); return bean; } } 複製程式碼

如何註冊BeanPostProcessor

ApplicationContext自動檢測實現BeanPostProcessor介面的配置元資料中定義的所有bean。它將這些bean註冊為後處理器,以便以後在建立bean時呼叫它們

然後Spring將在呼叫初始化回撥方法之前和之後將每個bean例項傳遞給這兩個方法,在這兩個方法中,你可以按自己喜歡的方式處理bean例項。


<beans>
     <bean id="customBeanPostProcessor"
               class="com.howtodoinjava.demo.processors.CustomBeanPostProcessor" />
</beans>
複製程式碼

BeanPostProcessor被呼叫方法時

通常,springDI容器會執行以下操作來建立一個bean

  1. 通過建構函式或工廠方法重新建立bean例項
  2. 設定屬性值值和對其它bean的引用
  3. 呼叫所有*Aware介面中定義的setter方法
  4. bean例項傳遞給每個bean後處理器的postProcessBeforeInitialization()方法
  5. 呼叫初始化回撥方法
  6. Bean例項傳遞到每個Bean後處理器的postProcessAfterInitialization()方法
  7. 這個bean已經可以被使用了
  8. 當容器關閉時,呼叫銷燬回撥方法

Spring BeanPostProcessor示例

為了展示示例用法,我使用了EmployeeDAOImpl類,如下所示:

public class EmployeeDAOImpl implements EmployeeDAO
{
    public EmployeeDTO createNewEmployee()
    {
        EmployeeDTO e = new EmployeeDTO();
        e.setId(1);
        e.setFirstName("Lokesh");
        e.setLastName("Gupta");
        return e;
    }
     
    public void initBean() {
        System.out.println("Init Bean for : EmployeeDAOImpl");
    }
     
    public void destroyBean() {
        System.out.println("Init Bean for : EmployeeDAOImpl");
    }
}
複製程式碼

bean及其後處理器的配置如下:

<bean id="customBeanPostProcessor" class="com.howtodoinjava.demo.processors.CustomBeanPostProcessor" />
     
<bean id="dao" class="com.howtodoinjava.demo.dao.EmployeeDAOImpl"  init-method="initBean" destroy-method="destroyBean"/>
複製程式碼

現在,啟動DI容器並檢視輸出:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
複製程式碼

輸出:

Called postProcessBeforeInitialization() for : dao
Init Bean for : EmployeeDAOImpl
Called postProcessAfterInitialization() for : dao
複製程式碼

很顯然,在初始化方法之前和之後呼叫了BeanPostProcessor方法。

原文連結:Spring BeanPostProcessor Example