DisposableBean瘪板,InitializingBean,ApplicationContextAware

?在spring容器初始化bean和銷毀bean的以前的操作有很多種漆诽,
  目前我知道的有:在xml中定義的時(shí)候用init-methoddestory-method侮攀,還有一種就是定義bean的時(shí)候?qū)崿F(xiàn)DisposableBeanInitializingBean 這兩個(gè)接口,打開InitializingBean的源碼:

public interface InitializingBean {

    /**
     * Invoked by a BeanFactory after it has set all bean properties supplied
     * (and satisfied BeanFactoryAware and ApplicationContextAware).
     * <p>This method allows the bean instance to perform initialization only
     * possible when all bean properties have been set and to throw an
     * exception in the event of misconfiguration.
     * @throws Exception in the event of misconfiguration (such
     * as failure to set an essential property) or if initialization fails.
     */
    void afterPropertiesSet() throws Exception;

}

根據(jù)注解很清楚的可以看出厢拭,afterPropertiesSet()表示在資源加載完以后兰英,初始化bean之前執(zhí)行的方法,我猜想spring底層應(yīng)該會(huì)在初始化bean的時(shí)候供鸠,應(yīng)該會(huì)使用(bean instanceof InitializingBean)判斷是不是實(shí)現(xiàn)了這個(gè)接口畦贸,其實(shí)在很多框架中都是這么干的,但是因?yàn)闆](méi)研究過(guò)spring源碼,暫且還不知道底層原理薄坏。這樣我們就可以在初始化的時(shí)候趋厉,做一些自己想要做的事了。
  同理胶坠,DisposableBean就是在一個(gè)bean被銷毀的時(shí)候君账,spring容器會(huì)幫你自動(dòng)執(zhí)行這個(gè)方法,估計(jì)底層原理也是差不多的沈善,對(duì)于一些使用完之后需要釋放資源的bean杈绸,我們都會(huì)實(shí)現(xiàn)這個(gè)接口,或者是配置destory-method方法矮瘟。源碼也基本是相似的瞳脓,只是把afterPropertiesSet改為destroy

ApplicationContextAware
  其實(shí)我們看到Aware就知道是干嘛用的了澈侠,就是屬性注入的劫侧,但是這個(gè)ApplicationContextAware的不同地方在于,實(shí)現(xiàn)了這個(gè)接口的bean哨啃,當(dāng)spring容器初始化的時(shí)候烧栋,會(huì)自動(dòng)的將ApplicationContext注入進(jìn)來(lái):

import org.apache.commons.lang.Validate;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
/**
 * applicationContext靜態(tài)化
 * 使用了ApplicationContextAware接口的類,如果受spring容器管理的
 * 話拳球,那么就會(huì)自動(dòng)的調(diào)用ApplicationContextAware中的setApplicationContext方法
 * @author Hotusm
 *
 */
@Service
@Lazy(false)
public class SpringContextHolder implements ApplicationContextAware,DisposableBean{
    
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        
        SpringContextHolder.applicationContext=applicationContext;
    }
    //清空applicationContext 設(shè)置其為null
    @Override
    public void destroy() throws Exception {
        SpringContextHolder.clearHolder();
    }
    //獲得applicationContext
    public static ApplicationContext getApplicationContext() {
        //assertContextInjected();
        return applicationContext;
    }
    
    public static void clearHolder(){
        applicationContext=null;
    }
    //獲取Bean
    public static <T> T getBean(Class<T> requiredType){
        //assertContextInjected();
        return (T) getApplicationContext().getBean(requiredType);
    }
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name){
        assertContextInjected();
        return (T) getApplicationContext().getBean(name);
    }
    //判斷application是否為空
    public static void assertContextInjected(){
        Validate.isTrue(applicationContext==null, "application未注入 审姓,請(qǐng)?jiān)趕pringContext.xml中注入SpringHolder!");
    }
    
}

因?yàn)槲覀冊(cè)谧鲩_發(fā)的時(shí)候,并不是說(shuō)在每一個(gè)地方都能將屬性注入到我們想要的地方去的祝峻,或者需要根據(jù)參數(shù)獲得不同的bean魔吐,比如在Utils使用到dao,我們就不能直接注入了莱找,這個(gè)時(shí)候就是我們需要封裝springContext的時(shí)候了酬姆,而ApplicationContextAware就起了關(guān)鍵性的作用。

3:還有一種是注解的用法:

在指定方法上加上@PostConstruct@PreDestroy注解來(lái)制定該方法是在初始化之后還是銷毀之前調(diào)用奥溺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辞色,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浮定,更是在濱河造成了極大的恐慌相满,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桦卒,死亡現(xiàn)場(chǎng)離奇詭異立美,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闸盔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門悯辙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事躲撰≌氡幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拢蛋,是天一觀的道長(zhǎng)桦他。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谆棱,這世上最難降的妖魔是什么快压? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮垃瞧,結(jié)果婚禮上蔫劣,老公的妹妹穿的比我還像新娘。我一直安慰自己个从,他們只是感情好脉幢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗦锐,像睡著了一般嫌松。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奕污,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天萎羔,我揣著相機(jī)與錄音,去河邊找鬼碳默。 笑死贾陷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腻窒。 我是一名探鬼主播昵宇,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼磅崭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼儿子!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起砸喻,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柔逼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后割岛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愉适,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年癣漆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了维咸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖癌蓖,靈堂內(nèi)的尸體忽然破棺而出瞬哼,到底是詐尸還是另有隱情,我是刑警寧澤租副,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布坐慰,位于F島的核電站,受9級(jí)特大地震影響用僧,放射性物質(zhì)發(fā)生泄漏结胀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一责循、第九天 我趴在偏房一處隱蔽的房頂上張望糟港。 院中可真熱鬧,春花似錦院仿、人聲如沸着逐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耸别。三九已至,卻和暖如春县钥,著一層夾襖步出監(jiān)牢的瞬間秀姐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工若贮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省有,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓谴麦,卻偏偏與公主長(zhǎng)得像蠢沿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匾效,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理舷蟀,服務(wù)發(fā)現(xiàn),斷路器面哼,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 這部分主要是開源Java EE框架方面的內(nèi)容野宜,包括Hibernate、MyBatis魔策、Spring匈子、Spring ...
    雜貨鋪老板閱讀 1,344評(píng)論 0 2
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,441評(píng)論 1 133
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 關(guān)于變量這一塊內(nèi)容闯袒,打一個(gè)比方虎敦,就像吃飯游岳,量(內(nèi)容)就是飯,變量就是盛飯的碗其徙,我們吃飯就是拿碗吃吭历,我們要想使用一個(gè)...
    河許人閱讀 1,330評(píng)論 0 5