Spring中有一個接口BeanPostProcessor,該接口我們叫後置處理器,作用是
在Bean對象實例化和依賴注入完畢後,在顯示調用初始化方法的前後添加我們自己的邏輯。接口源碼如下:一、自定義後置處理器
<code>public
class
MyBeanPostProcessor
implements
BeanPostProcessor
{public
ObjectpostProcessBeforeInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("初始化 before--實例化的bean對象:"
+beanName);return
bean; }public
ObjectpostProcessAfterInitialization
(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
StringgetName
() {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
Useruser
()
{ 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
ObjectpostProcessBeforeInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("第2個before--實例化的bean對象:"
+beanName);return
bean; }public
ObjectpostProcessAfterInitialization
(Object bean, String beanName)
throws
BeansException { System.out.println("第2個after...實例化的bean對象:"
+beanName);return
bean; }public
int
getOrder
()
{return
2
; } }/<code>