淺談Spring中的BeanPostProcessor

? ? 入口依舊是在refresh方法中疮装,之前提到了obtainFreshBeanFactory是類加載完成后構(gòu)建BeanDefinition缘琅,構(gòu)建完成之后就需要對Bean進(jìn)行實例化了。關(guān)注invokeBeanFactoryPostProcessors(負(fù)責(zé)BeanFactoryPostProcessor和BeanDefinitionRegisterPostProcessor這兩個接口的調(diào)用)和registerBeanPostProcessors(負(fù)責(zé)把實現(xiàn)了BeanPostProcessor的接口的類實例化后廓推,加入BeanFactory中)方法刷袍。

invokeBeanFactoryPostProcessors

????該方法主要作用是為了獲取BeanFactoryPostProcessor或者BeanDefinitionRegisterPostProcessor的實例。為了方便調(diào)試樊展,我們自定義一個BeanDefinitionRegisterPostProcessor呻纹,并重寫里面的postProcessBeanDefinitionRegistry和postProcessBeanFactory方法(從BeanDefinitionRegisterPostProcessor的源碼來看,發(fā)現(xiàn)它是繼承了BeanFactoryPostProcessor专缠,因此無需單獨實現(xiàn)BeanFactoryPostProcessor雷酪,如圖1)。

圖1

????別忘了在xml中配置bean涝婉,圖2為實現(xiàn)了BeanDefinitionRegisterPostProcessor的自定義類哥力,并打印了代碼運行后的日志信息。

圖2

BeanDefinitionRegisterPostProcessor

? ? 進(jìn)來源碼后嘁圈,分三部分依次調(diào)用:1省骂、調(diào)用實現(xiàn)了PriorityOrdered排序接口;2最住、調(diào)用實現(xiàn)了Ordered排序接口;3怠惶、沒有調(diào)用任何排序接口涨缚。PriorityOrdered是Ordered接口的子類,兩者完全一樣,只不過在Spring中脓魏,實現(xiàn)了PriorityOrdered接口的類會喲與更高的優(yōu)先級兰吟。

? ? 下面的操作會對上述每一部分都執(zhí)行一遍,如圖3

圖3

? ? 1茂翔、調(diào)用getBeanNameForType混蔼,再往下看,最終調(diào)用的是doGetBeanNamesForType珊燎,這個方法首先是迭代循環(huán)之前存到緩存中的beanDefinitionNames惭嚣,然后獲取到實現(xiàn)了BeanDefinitionRegistryPostProcessor接口的所有類的BeanDefinition所對應(yīng)的beanName,但是對于FactoryBean來說悔政,還需要加上“&”前綴晚吞,如圖4。

圖4

否則后面獲取到的就不是FactoryBean對象了谋国,而是實現(xiàn)了getObject方法返回的實例槽地。如圖5,這是實現(xiàn)了FactoryBean的類芦瘾;圖6是獲取到的不同對象:

圖5
圖6

? ? 2捌蚊、對實現(xiàn)了排序接口的類進(jìn)行排序:

? ? 3、調(diào)用invokeBeanDefinitionRegistryPostProcessors調(diào)用實現(xiàn)了排序接口的BeanDefinitionRegistryPostProcessor近弟,就能調(diào)用到我們自定義的重寫方法postProcessBeanDefinitionRegistry逢勾,如圖7:

圖7

-----------------------------------------------------------------------------------------------------------------------------------

BeanFactoryPostProcessor

? ? 同BeanDefinitionRegistryPostProcessor一樣的操作邏輯,最終調(diào)用的是invokeBeanFactoryPostProcessors藐吮,就能調(diào)用到我們自定義的重寫方法postProcessBeanFactory溺拱,如圖8,是獲取到實現(xiàn)幾個排序接口的beanName谣辞;如圖9則是和上面的使用方式一樣:

圖8
圖9

registerBeanPostProcessors

? ? 首先調(diào)用getBeanNameForType獲取到所有實現(xiàn)了BeanPostProcessor接口的BeanDefinition的beanName迫摔,然后依次判斷是否實現(xiàn)了PriorityOrdered、Ordered或者沒有實現(xiàn)排序接口泥从,都會用各自的List包括起來句占。

? ? 遍歷對應(yīng)的List對象,通過getBean獲取到BeanPostProcessor后躯嫉,會去判斷獲取到的BeanPostProcessor的類型是否是MergedBeanDefinitionPostProcessor纱烘,如果是的話添加到internalPostProcessors(內(nèi)部使用)中。用sortPostProcessors排序后祈餐,調(diào)用registerBeanPostProcessors擂啥,把前面的三個實現(xiàn)排序接口的BeanPostProcessor和internalPostProcessors注冊進(jìn)BeanFactory中,如圖10:

圖10

? ? 上面提到了getBean方法就是獲取實例的方法帆阳,因為涉及到的東西比較多哺壶,放到getBean中來講。

????https://github.com/LuoChen1996/my_spring.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市山宾,隨后出現(xiàn)的幾起案子至扰,更是在濱河造成了極大的恐慌,老刑警劉巖资锰,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敢课,死亡現(xiàn)場離奇詭異,居然都是意外死亡绷杜,警方通過查閱死者的電腦和手機(jī)直秆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來接剩,“玉大人切厘,你說我怎么就攤上這事“萌保” “怎么了疫稿?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹃两。 經(jīng)常有香客問我遗座,道長,這世上最難降的妖魔是什么俊扳? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任途蒋,我火速辦了婚禮,結(jié)果婚禮上馋记,老公的妹妹穿的比我還像新娘号坡。我一直安慰自己,他們只是感情好梯醒,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布宽堆。 她就那樣靜靜地躺著,像睡著了一般茸习。 火紅的嫁衣襯著肌膚如雪畜隶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天号胚,我揣著相機(jī)與錄音籽慢,去河邊找鬼。 笑死猫胁,一個胖子當(dāng)著我的面吹牛箱亿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杜漠,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼极景,長吁一口氣:“原來是場噩夢啊……” “哼察净!你這毒婦竟也來了驾茴?” 一聲冷哼從身側(cè)響起盼樟,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锈至,沒想到半個月后晨缴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡峡捡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年击碗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片们拙。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稍途,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砚婆,到底是詐尸還是另有隱情械拍,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布装盯,位于F島的核電站坷虑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏埂奈。R本人自食惡果不足惜迄损,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望账磺。 院中可真熱鬧芹敌,春花似錦、人聲如沸垮抗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽借宵。三九已至幌衣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壤玫,已是汗流浹背豁护。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留欲间,地道東北人楚里。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像猎贴,于是被迫代替她去往敵國和親班缎。 傳聞我的和親對象是個殘疾皇子蝴光,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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