spring的后置處理器

spring的后置處理器有兩類疆柔,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期。

BF后置處理器

Spring是一個bean依賴注入容器,容器是BF,它的上級對象是applicationContxt,applicationContxt在容器功能上附加了一下新的功能卦洽。我們使用spring時,用的都是applicationConext的實現(xiàn)類斜棚。
我們在初始化這些applicationConext時阀蒂,最終調(diào)用的都是org.springframework.context.support.AbstractApplicationContext#refresh方法用于容器的初始化。這個方法是一個模板方法弟蚀,規(guī)定了容器實例化的步驟蚤霞。其中BF初始化完成后,會調(diào)用BF的后置處理器對BF進行后置處理义钉。而后置處理器的調(diào)用是在org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors這個方法中進行的昧绣。

BF的后置處理器有兩種,BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor捶闸。BF后置處理器和BD(BeanDefinition)后置處理器夜畴。BD后置處理器是BF后置處理器的子接口。下面是BF后置處理器的api截圖删壮。

1590843602997.png

invokeBeanFactoryPostProcessors方法內(nèi)贪绘,調(diào)用后置處理器的步驟如下:

  1. 通過ac(applicationContext)的addBeanFactoryPostProcessor方法加入的BD后置處理器,按照加入順序調(diào)用央碟。
  2. ac中類型為bd后置處理器的税灌,擁有PriorityOrdered接口的BD后置處理器。
  3. ac中類型為bd后置處理器的,擁有Ordered接口的BD后置處理器垄琐。
  4. ac中類型為bd后置處理器的,PriorityOrdered和Ordered接口都沒實現(xiàn)的BeanDefinitionRegistryPostProcessor
  5. ac中類型為bf后置處理器的经柴,擁有PriorityOrdered接口的BF后置處理器狸窘。
  6. ac中類型為bf后置處理器的,擁有Ordered接口的BF后置處理器坯认。
  7. ac中類型為bf后置處理器的翻擒,PriorityOrdered和Ordered接口都沒實現(xiàn)的BeanFactoryPostProcessor

在AnnotationConfigApplicationContext上下文中,會有一個關(guān)鍵的BD后置處理器:ConfigurationClassPostProcessor牛哺。它是用來掃描所有交給spring管理的注解類的陋气。將其解析為BD實例放到AC中去。

Bean后置處理器

spring管理的是bean引润,所以bean的實例化是一個重要的過程巩趁。spring是通過org.springframework.beans.factory.support.AbstractBeanFactory#getBean方法實例化并初始化Bean。實例化Bean的過程中淳附,可以通過bean的后置處理器插手Bean的實例化過程议慰。

Bean的實例化過程如下:

  1. 解析BD
  2. 確定構(gòu)造方法
  3. 用構(gòu)造方法實例化(構(gòu)造方法依賴不能進行循環(huán)依賴)
  4. 屬性注入
  5. 初始化

在這個過程中,spring內(nèi)設(shè)了8個bean的后置處理器調(diào)用點奴曙,用來進行擴展别凹。

Bean后置處理器有五種:

  1. BeanPostProcessor:基本后置處理器洽糟,有兩個方法,分別在Bean初始化前后調(diào)用
    • postProcessBeforeInitialization在初始化之前調(diào)用
    • postProcessAfterInitialization在初始化之后調(diào)用
  2. DestructionAwareBeanPostProcessor在bean被摧毀的時候調(diào)用
  3. InstantiationAwareBeanPostProcessor:有三個方法坤溃,
    • postProcessBeforeInstantiation在最開始調(diào)用,如果返回Bean實例不為空薪介,直接調(diào)用BeanPostProcessor的postProcessAfterInitialization方法沉御,返回該bean昭灵,不在進行其他動作。
    • postProcessAfterInstantiation判斷是否需要進行屬性填充
    • postProcessPropertyValues烂完,進行屬性填充前试疙,處理bean的PropertyValues。用于屬性填充
  4. MergedBeanDefinitionPostProcessor抠蚣,只有一個方法,postProcessMergedBeanDefinition怀跛,在實例化之前,對BD進行后置處理忠蝗。
  5. SmartInstantiationAwareBeanPostProcessor漓拾,有三個方法
    • predictBeanType,預(yù)測InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法返回的類型骇两。
    • determineCandidateConstructors低千,確定該bd的構(gòu)造函數(shù),找不到用默認的構(gòu)造函數(shù)
    • getEarlyBeanReference示血,在需要獲取earlyBean時矾芙,在返回earlyBean前對earlyBean進行后置處理。

Bean后置處理器的API截圖:

1590846593893.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葱绒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌失球,老刑警劉巖帮毁,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈疚,死亡現(xiàn)場離奇詭異,居然都是意外死亡猾浦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門音瓷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夹抗,“玉大人兔朦,你說我怎么就攤上這事磨确。” “怎么了摆舟?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵邓了,是天一觀的道長骗炉。 經(jīng)常有香客問我,道長句葵,這世上最難降的妖魔是什么乍丈? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮忆矛,結(jié)果婚禮上请垛,老公的妹妹穿的比我還像新娘。我一直安慰自己瞳腌,他們只是感情好镜雨,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菲盾,像睡著了一般各淀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上临谱,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天奴璃,我揣著相機與錄音,去河邊找鬼抄课。 笑死雳旅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抵拘。 我是一名探鬼主播型豁,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼偷遗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喉酌?” 一聲冷哼從身側(cè)響起泵喘,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤纪铺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲜锚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡绒极,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年垄提,在試婚紗的時候發(fā)現(xiàn)自己被綠了周拐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡审丘,死狀恐怖罕容,靈堂內(nèi)的尸體忽然破棺而出锦秒,到底是詐尸還是另有隱情喉镰,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布生真,位于F島的核電站捺宗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏长已。R本人自食惡果不足惜昼牛,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一贰健、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伶椿,春花似錦氓侧、人聲如沸导狡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚聚。三九已至标锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間料皇,已是汗流浹背践剂。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留优质,地道東北人军洼。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓匕争,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甘桑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348