Spring中的后置處理器BeanPostProcessor

BeanPostProcessor接口作用:

如果我們想在Spring容器中完成bean實例化漫玄、配置以及其他初始化方法前后要添加一些自己邏輯處理压彭。我們需要定義一個或多個BeanPostProcessor接口實現(xiàn)類,然后注冊到Spring IoC容器中壮不。

package com.test.spring;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * bean后置處理器
 * @author zss
 *
 */
public class PostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {//過濾掉bean實例ID為narCodeService
            return bean;
        }
        System.out.println("后置處理器處理bean=【"+beanName+"】開始");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {
            return bean;
        }
        System.out.println("后置處理器處理bean=【"+beanName+"】完畢!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

}

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

## BeanPostProcessor API:

public interface BeanPostProcessor {  
  
    /** 
     * Apply this BeanPostProcessor to the given new bean instance <i>before</i> any bean 
     * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} 
     * or a custom init-method). The bean will already be populated with property values.    
     */  
    //實例化菱阵、依賴注入完畢,在調(diào)用顯示的初始化之前完成一些定制的初始化任務(wù)  
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;  
  
      
    /** 
     * Apply this BeanPostProcessor to the given new bean instance <i>after</i> any bean 
     * initialization callbacks (like InitializingBean's {@code afterPropertiesSet}   
     * or a custom init-method). The bean will already be populated with property values.       
     */  
    //實例化晴及、依賴注入、初始化完畢時執(zhí)行  
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;  
  
}

由API可以看出:
1:后置處理器的postProcessorBeforeInitailization方法是在bean實例化虑稼,依賴注入之后及自定義初始化方法(例如:配置文件中bean標簽添加init-method屬性指定Java類中初始化方法、
@PostConstruct注解指定初始化方法蛛倦,Java類實現(xiàn)InitailztingBean接口)之前調(diào)用
2:后置處理器的postProcessorAfterInitailization方法是在bean實例化、依賴注入及自定義初始化方法之后調(diào)用

注意:
1.BeanFactory和ApplicationContext兩個容器對待bean的后置處理器稍微有些不同溯壶。ApplicationContext容器會自動檢測Spring配置文件中那些bean所對應(yīng)的Java類實現(xiàn)了BeanPostProcessor
接口,并自動把它們注冊為后置處理器且改。在創(chuàng)建bean過程中調(diào)用它們,所以部署一個后置處理器跟普通的bean沒有什么太大區(qū)別钾虐。
2.BeanFactory容器注冊bean后置處理器時必須通過代碼顯示的注冊笋庄,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法

/**  
     * Add a new BeanPostProcessor that will get applied to beans created  
     * by this factory. To be invoked during factory configuration.  
     * <p>Note: Post-processors submitted here will be applied in the order of  
     * registration; any ordering semantics expressed through implementing the  
     * {@link org.springframework.core.Ordered} interface will be ignored. Note  
     * that autodetected post-processors (e.g. as beans in an ApplicationContext)  
     * will always be applied after programmatically registered ones.  
     * @param beanPostProcessor the post-processor to register  
     */    
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

Spring如何調(diào)用多個BeanPostProcessor實現(xiàn)類:

我們可以在Spring配置文件中添加多個BeanPostProcessor(后置處理器)接口實現(xiàn)類,在默認情況下Spring容器會根據(jù)后置處理器的定義順序來依次調(diào)用菌仁。
在Spring機制中可以指定后置處理器調(diào)用順序,通過讓BeanPostProcessor接口實現(xiàn)類實現(xiàn)Ordered接口getOrder方法济丘,該方法返回一整數(shù),默認值為 0摹迷,優(yōu)先級最高,值越大優(yōu)先級越低

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峡碉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲫寄,更是在濱河造成了極大的恐慌吉执,老刑警劉巖地来,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咕宿,居然都是意外死亡,警方通過查閱死者的電腦和手機荠列,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肌似,“玉大人,你說我怎么就攤上這事川队。” “怎么了固额?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斗躏。 經(jīng)常有香客問我,道長啄糙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任隧饼,我火速辦了婚禮,結(jié)果婚禮上燕雁,老公的妹妹穿的比我還像新娘。我一直安慰自己拐格,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布禁荒。 她就那樣靜靜地躺著,像睡著了一般呛伴。 火紅的嫁衣襯著肌膚如雪勃痴。 梳的紋絲不亂的頭發(fā)上热康,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音姐军,去河邊找鬼。 笑死奕锌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惊暴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼辽话,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油啤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤益咬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幽告,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅鹦,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡帘瞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年蒿讥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抛腕。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖担敌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情全封,我是刑警寧澤桃犬,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布行楞,位于F島的核電站,受9級特大地震影響子房,放射性物質(zhì)發(fā)生泄漏形用。R本人自食惡果不足惜证杭,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望解愤。 院中可真熱鬧,春花似錦琢歇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魄宏。三九已至秸侣,卻和暖如春宠互,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背予跌。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留券册,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓烁焙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骄蝇。 傳聞我的和親對象是個殘疾皇子膳殷,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理赚窃,服務(wù)發(fā)現(xiàn)册招,斷路器勒极,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,441評論 1 133
  • 繼續(xù)臨《多寶塔》冀惭,念念不忘,必有回響散休。
    行之_cd閱讀 204評論 0 2