Spring後置處理器BeanPostProcessor

Spring中有一個接口BeanPostProcessor,該接口我們叫後置處理器,作用是

在Bean對象實例化和依賴注入完畢後,在顯示調用初始化方法的前後添加我們自己的邏輯。接口源碼如下:


Spring後置處理器BeanPostProcessor


一、自定義後置處理器

<code> 
 

public

class

MyBeanPostProcessor

implements

BeanPostProcessor

{

public

Object

postProcessBeforeInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"初始化 before--實例化的bean對象:"

+beanName);

return

bean; }

public

Object

postProcessAfterInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"初始化 after...實例化的bean對象:"

+beanName);

return

bean; } }/<code>

注:接口中兩個方法不能返回null,如果返回null那麼在後續初始化方法將報空指針異常或者通過getBean()方法獲取不到bena實例對象,因為後置處理器從Spring IoC容器中取出bean實例對象沒有再次放回IoC容器中

然後定義實體類User:

<code>

public

class

User

{

private

int

id;

private

String name;

public

User

(

)

{ System.

out

.println(

"User 被實例化"

); }

public

int

getId

(

)

{

return

id; }

public

void

setId

(

int

id

)

{

this

.id = id; }

public

String

getName

(

)

{

return

name; }

public

void

setName

(

String name

)

{ System.

out

.println(

"設置name="

+name);

this

.name = name; }

public

void

customInit

(

)

{ System.

out

.println(

"User 中自定義的初始化方法"

); } }/<code>

再將User類配置成bean對象:

<code> (initMethod = 

"customInit"

)

public

User

user

()

{ User user =

new

User(); user.setName(

"張三"

);

return

user; }/<code>

這裡也可以使用xml配置。

然後啟動我們的項目,在控制檯輸出如下:

User 被實例化

設置name=張三

初始化 before--實例化的bean對象:user

User 中自定義的初始化方法

初始化 after...實例化的bean對象:user

通過輸出語句我們能看到postProcessBeforeInitialization方法的輸出語句是在Bean實例化及屬性注入後執行的,且在自定義的初始化方法之前執行(通過Bean註解的initMethod指定)。而postProcessAfterInitialization方法是在自定義初始化方法執行之後執行的。

注意:

1.BeanFactory和ApplicationContext兩個容器對待bean的後置處理器稍微有些不同。ApplicationContext容器會自動檢測Spring配置文件中那些bean所對應的Java類實現了BeanPostProcessor接口,並自動把它們註冊為後置處理器。在創建bean過程中調用它們,所以部署一個後置處理器跟普通的bean沒有什麼太大區別。

2.BeanFactory容器註冊bean後置處理器時必須通過代碼顯示的註冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了註冊方法。

<code>ConfigurableBeanFactory factory = 

new

XmlBeanFactory(

new

ClassPathResource(

"applicationContext.xml"

)); factory.addBeanPostProcessor(

new

MyBeanPostProcessor());/<code>

二、多個後置處理器

我們可以在Spring中添加多個BeanPostProcessor(後置處理器)接口實現類,默認情況下Spring容器會根據後置處理器定義的順序依次執行。

當然,如果你想指定後置處理器的調用順序,那麼你可以通過實現Ordered接口的getOrder方法來自定義順序。該方法默認值為 0,優先級最高,值越大優先級越低。

<code> 

public

class

MyBeanPostProcessor2

implements

BeanPostProcessor

,

Ordered

{

public

Object

postProcessBeforeInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"第2個before--實例化的bean對象:"

+beanName);

return

bean; }

public

Object

postProcessAfterInitialization

(Object bean, String beanName)

throws

BeansException

{ System.out.println(

"第2個after...實例化的bean對象:"

+beanName);

return

bean; }

public

int

getOrder

()

{

return

2

; } }/<code>


分享到:


相關文章: