Spring是如何回調(diào)Aware系列接口?

寫在最前

當(dāng)我們運(yùn)行Web容器或是以SE的方式運(yùn)行Spring程序的過程中岭洲,你有沒有想過Spring是如何實(shí)現(xiàn)回調(diào)生命周期中的那些過程呢?今天我們就以生命周期中回調(diào)Aware接口為例,來說說Spring的回調(diào)過程顾翼。

正文

1.Aware接口

Aware接口

Aware接口在Spring的3.1版本中出現(xiàn)芋忿,并且beans包中,屬于spring的核心蒋荚。上圖中的描述告訴我們戳稽,Aware是一個具有標(biāo)識作用的超級接口,實(shí)現(xiàn)該接口的bean是具有被spring 容器通知的能力的期升,而被通知的方式就是通過回調(diào)广鳍。對于這段英文,我并沒有直譯吓妆,而是加上了自己的理解赊时。總之行拢,一句話也就是說:直接或間接實(shí)現(xiàn)了這個接口的類祖秒,都具有被spring容器通知的能力。

那我們看看spring中實(shí)現(xiàn)了該超級接口的子接口有哪些舟奠?

Aware的子接口

哇竭缝,多如牛毛!咦沼瘫,別動抬纸,有幾個好熟悉的接口。例如:ResourceLoaderAware耿戚、BeanNameAware湿故、ApplicationContextAware阿趁、BeanNameAware... 熟悉spring生命周期的童鞋可能見過這些接口。不錯坛猪,這些接口就是今天我們的主角脖阵。

2.Spring Boot的大致啟動過程

我們以Spring Boot的啟動過程為例,看看這些Aware接口是如何被調(diào)用到的墅茉。

Spring Boot啟動入口

如上圖命黔,這里是以內(nèi)嵌jetty的方式啟動Spring Boot。 通常我們啟動Spring boot就斤,都是直接調(diào)用SpringApplication的run方法悍募,再看看run方法的內(nèi)部:

SpringApplication的run方法

主要看紅色圈起的地方,其它的代碼可以忽略洋机。這里調(diào)用了createApplicationContext方法去創(chuàng)建容器上下文坠宴。再來看看createApplicationContext()方法的內(nèi)部:

SpringApplication的createApplicationContext方法
SpringApplication的常量

webEnvironment是一個boolean型的變量,用來表示當(dāng)前的應(yīng)用類型是不是web應(yīng)用槐秧。如果為false啄踊,則代表是普通應(yīng)用(JavaSE);反之就是web應(yīng)用(Java Web)刁标,則創(chuàng)建可運(yùn)行web應(yīng)用的上下文颠通。我們講述的是web應(yīng)用,所以這里的contextClass是AnnotationConfigEmbeddedWebApplicationContext膀懈。createApplicationContext()方法中的最后一行代碼是創(chuàng)建了一個context顿锰。我們跟進(jìn)去看看這個context是如何創(chuàng)建的:

BeanUtils的instantiate()方法

上圖中的第七行代碼,通過反射實(shí)例化了contextClass启搂,這里實(shí)例化的正是AnnotationConfigEmbeddedWebApplicationContext類硼控,調(diào)用的是無參的構(gòu)造器。我們再去看看AnnotationConfigEmbeddedWebApplicationContext的無參構(gòu)造器:

AnnotationConfigEmbeddedWebApplicationContext的無參構(gòu)造器

如上圖胳赌,構(gòu)造器中只是設(shè)置了reader和scanner牢撼。這里我們先忽略它們。除此之外疑苫,實(shí)例化一個類時它的直接或間接的父類也同樣會被實(shí)例化熏版。看看AnnotationConfigEmbeddedWebApplicationContext有些哪些父類:

AnnotationConfigEmbeddedWebApplicationContext的繼承關(guān)系

我們耐心的一層一層的跟蹤父類和間接父類的構(gòu)造器到GenericApplicationContext才發(fā)現(xiàn)無參構(gòu)造器中在做一些事情捍掺。如下圖:

GenericApplicationContext

看到這里撼短,我們終于看見曙光了。xxxBeanFactory是生成beans對象的工廠類挺勿。在DefaultListableBeanFactory的父類AbstractAutowireCapableBeanFactory中有兩個很重要的方法:
initializeBean()和createBean()方法曲横。initializeBean是用來初始化beans的,看下圖代碼:

AbstractAutowireCapableBeanFactory的initializeBean方法

看到這里我們就知道了不瓶,Aware系列的接口是這么被調(diào)用的了禾嫉,并把需要的內(nèi)部對象回傳給Aware的子類實(shí)例對象灾杰,那么外部就可以獲取到spring內(nèi)部的一些對象了。例如:我們獲取BeanFactory夭织,然后手動創(chuàng)建beans對象等等吭露。

寫在最后

看完上面的過程有沒有發(fā)現(xiàn)少了點(diǎn)什么東西吠撮? 是不是發(fā)現(xiàn)少了:Spring Boot是如何調(diào)用到initializeBean()的呢尊惰?欲知后事如何,且看下回分解泥兰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弄屡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鞋诗,更是在濱河造成了極大的恐慌膀捷,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削彬,死亡現(xiàn)場離奇詭異全庸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)融痛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門壶笼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雁刷,你說我怎么就攤上這事覆劈。” “怎么了沛励?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵责语,是天一觀的道長。 經(jīng)常有香客問我目派,道長坤候,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任企蹭,我火速辦了婚禮白筹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘练对。我一直安慰自己遍蟋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布螟凭。 她就那樣靜靜地躺著虚青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪螺男。 梳的紋絲不亂的頭發(fā)上棒厘,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天纵穿,我揣著相機(jī)與錄音,去河邊找鬼奢人。 笑死谓媒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的何乎。 我是一名探鬼主播句惯,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼支救!你這毒婦竟也來了抢野?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤各墨,失蹤者是張志新(化名)和其女友劉穎指孤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贬堵,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恃轩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了黎做。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉跛。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖引几,靈堂內(nèi)的尸體忽然破棺而出昧互,到底是詐尸還是另有隱情,我是刑警寧澤伟桅,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布敞掘,位于F島的核電站,受9級特大地震影響楣铁,放射性物質(zhì)發(fā)生泄漏玖雁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一盖腕、第九天 我趴在偏房一處隱蔽的房頂上張望赫冬。 院中可真熱鬧,春花似錦溃列、人聲如沸劲厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补鼻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間风范,已是汗流浹背咨跌。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼婿,地道東北人锌半。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像寇漫,于是被迫代替她去往敵國和親刊殉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理猪腕,服務(wù)發(fā)現(xiàn)冗澈,斷路器钦勘,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,808評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法陋葡,類相關(guān)的語法,內(nèi)部類的語法彻采,繼承相關(guān)的語法腐缤,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 從日本回來也快2個月了肛响,時間過的真是太快了岭粤,始終還是念念不忘新宿,在那里逛街可以逛到精疲力盡特笋。 新宿是東京最著名的...
    九號咖啡屋閱讀 670評論 3 10
  • 即使時間過去了這么久剃浇,我也依然覺得這兩年來自己其實(shí)沒有什么長進(jìn),唯一進(jìn)步的可能是在對待和別人的關(guān)系上猎物,自己又進(jìn)步了...
    面包主義閱讀 665評論 0 0