1. 程式人生 > >Spring的BeanPostProcessor後置處理器與bean的生命週期

Spring的BeanPostProcessor後置處理器與bean的生命週期

前言

    本文將把Spring在Bean的生命週期中涉及到的後置處理器一一梳理出來,並簡要說一下功能,至於每個後置處理器在實際擴充套件中的用處,還要後續慢慢探索總結。

正文

    下面一步步跟進探尋那些後置處理器們。首先進入AbstractApplicationContext類中的refresh方法,繼續追蹤至此模板方法中的finishBeanFactoryInitialization方法,然後點進beanFactory.preInstantiateSingletons()方法,進入DefaultListableBeanFactory類中,點進getBean方法,繼續點選doGetBean方法,它是獲取bean的核心方法,但我們只關注裡面lambda表示式中的createBean方法,點之進入AbstractAutowireCapableBeanFactory#createBean方法,逐漸逼近無知獸。

第一處

    在createBean方法的resolveBeforeInstantiation方法中,遇見第一處後置處理器的呼叫,而且一次調了兩種,分別是:InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation和

BeanPostProcessor.postProcessAfterInitialization。如下截圖所示:

 

 

此處如果before的方法返回的bean不為null, 方法返回之後在createBean方法中就不會往下走了(即後續的2-8處理器都不走)而是直接返回。

額外說一下Spring的使用例項。如果bean中有切面類,那麼會呼叫AbstractAutoProxyCreator#postProcessBeforeInstantiation中的實現邏輯,在此方法中將切面類加入advisedBeans中,這樣後續切面會自動忽略對advisedBeans中物件的攔截。

第二處

    進入createBean中的doCreateBean方法,在createBeanInstance方法中呼叫了determineConstructorsFromBeanPostProcessors方法,裡面是第二處後置處理器的呼叫:SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors。截圖如下所示,此處後置處理器用於推斷構造方法,預設呼叫的實現類是AutowiredAnnotationBeanPostProcessor。

 

 

 第三處

    回到doCreateBean方法,繼續往下看applyMergedBeanDefinitionPostProcessors方法,找到第三處後置處理器的呼叫:MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。截圖如下所示:

 

 

 第四處

    在doCreateBean中繼續往下找,getEarlyBeanReference方法中找到第四處呼叫:SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference。此處用於解決迴圈依賴,截圖如下:

 

 

 第五處

    繼續往下,進入populateBean方法,在此方法中有兩處呼叫,第五處:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation。返回布林型別,用於判斷是不是需要屬性填充,如果返回false則直接從populateBean中返回,不再執行第6/7/8處。

 

 

 第六處

    第六處呼叫了兩個方法:InstantiationAwareBeanPostProcessor.postProcessProperties和InstantiationAwareBeanPostProcessor.postProcessPropertyValues。此處用於做屬性填充,截圖如下:

 

 

 第七處

    回到doCreateBean中繼續往下,進入initializeBean方法,此方法中也有兩處呼叫,在applyBeanPostProcessorsBeforeInitialization中呼叫了第七處:BeanPostProcessor.postProcessBeforeInitialization。

呼叫的是通常意義上BeanPostProcessor的before方法

 

 第八處

    在applyBeanPostProcessorsAfterInitialization中呼叫了第八處:BeanPostProcessor.postProcessAfterInitialization。呼叫的是通常意義上BeanPostProcessor的after方法

 

Spring的切面就是基於此方法進行的,呼叫的實現方法是AbstractAutoProxyCreator#postProcessAfterInitialization。它會先將切面類放入advisedBeans中,標記為true,表示需要用切面攔截。然後呼叫AbstractAutoProxyCreator#createProxy方法生成代理。

第九處

    第九處是在執行AbstractApplicationContext#close方法銷燬bean時觸發的,最終呼叫到的是DisposableBeanAdapter#destroy,在此方法中呼叫了:DestructionAwareBeanPostProcessor.postProcessBeforeDestruction。用於在銷燬bean之前做操作。為什麼DestructionAwareBeanPostProcessor中沒有after方法?因為執行after的時候所有bean都沒了,Spring認為你也沒必要做什麼擴充套件了。

 

 

小結

    以上就是Spring的bean宣告週期內經手的9處後置處理器呼叫,共涉及到5個介面,本文只是簡要說明了其作用,其真實的使用場景很多,需要後續慢慢摸索。

 

相關推薦

Spring的BeanPostProcessor處理器bean生命週期

前言     本文將把Spring在Bean的生命週期中涉及到的後置處理器一一梳理出來,並簡要說一下功能,至於每個後置處理器在實際擴充套件中的用處,還要後續慢慢探索總結。 正文     下面一步步跟進探尋那些後置處理器們。首先進入AbstractApplicationC

spring原始碼分析系列5:ApplicationContext的初始化Bean生命週期

回顧Bean與BeanDefinition的關係. BeanFactory容器. ApplicationContext上下文. 首先總結下: 開發人員定義Bean資訊:分為XML形式定義;註解式定義 ApplicationContext蒐集Bean的定義;儲存到BeabFactory容器的中。 BeanFa

Spring Bean生命週期處理器、定義繼承

目錄: 瞭解Spring的基本概念 Spring簡單的示例 Spring Bean的定義及作用域 1.Bean的生命週期 Bean的生命週期可以簡單的理解為:Bean的定義——Bean的初始化——Bean的使用——Bean的銷燬 在其生命週期裡,有兩個重要的回撥方法,可以在初始化Bean和銷燬

BeanPostProcessor bean處理器

exceptio col bject font for stp sys 方法 BE 一、MyBeanPostProcessor 類,自定 bean 的後只處理器類。當你在初始化容器中的 bean 之前和之後,都會調用該處理器中的方法 @Component //將該後後置處

Spring Bean生命週期回撥——初始化回撥(init-method)銷燬回撥(destroy-method)

實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解 初始化回撥(init-method) 1、使用介面 org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定bean必

Spring Bean前置處理器的使用

Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter兩個介面都可以實現對bean前置後置處理的效果,那這次先講解一下BeanPostProcessor處理器的使用 先看一下BeanPostPr

Spring學習 --------建立 Bean 處理器

                                                          建立 Bean 後置處理器 Bean 後置處理器允許在呼叫初始化方法前後對 Bean 進行額外的處理 Bean 後置處理器對 IOC 容器裡的所有 Bean

Spring註解驅動開發——bean處理器

BeanPostProcessor:是一個介面,bean的後置處理器(實際是在bean的初始化前後執行操作) public class MyBeanPostProcessor implements BeanPostProcessor{ /** * bean是容器呼叫

spring-建立 Bean 處理器

Bean 後置處理器允許在呼叫初始化方法前後對 Bean 進行額外的處理. Bean 後置處理器對 IOC 容器裡的所有 Bean 例項逐一處理, 而非單一例項. 其典型應用是: 檢查 Bean 屬性

Bean 處理器

IOC容器自動識別後置處理器InitBeforBean 改bean實現BeanFactoryPostProcessor 該介面,更改 BeanLife bean的屬性值和作用域@Test public

Jmeter處理器

xtra 用戶信息 nbsp ssi 查詢 後置處理器 什麽是 cto tor 一、什麽是關聯? 將請求1的輸出 作為 請求2 的輸入,則稱之為關聯 二、通過JSON Path Extrator進行關聯 1、添加JSON Path Extractor(需要下載安裝插件)

第三篇 Postman之 Tests(處理器,斷言)

下一個 parse 後置處理器 token 9.png jmeter pri 獲取 strong 第二篇裏講了手動設置全局變量及局部變量的方法,但是這有一個缺點,就是每次測試之前,都需要獲取相關變量值,手動再填寫更新到對應的全局變量或者局部變量裏,這對於想進行自動化執行的人

Jmeter入門13 處理器JSON Extractor提取json的多個值

soft 缺省 mic nbsp 分隔符 處理器 獲取 索引 get json串 []表示對象組成的數組,{}表示對象。 對象裏包含多個 "屬性":屬性值。屬性值可以是值,或數組,或對象。 JSON Extractor使用json path表達式匹配。$表示響應的根對象

2.Spring的Bean生命週期和組裝方式

1.Spring IoC容器概述    Spring IoC容器:      Spring容器即體現了IoC原理    Spring容器通過讀取配置元資料負責對Beans例項化、配置和裝配     配置元資

【Spring註解】2、Bean生命週期

1、初始化和銷燬 通過@Bean註解的initMethod和destroyMethod屬性 InitializingBean介面、DisposableBean介面 可以使用JSR250: @PostConstruct:在Bean建立完成並且屬性

6、第十 - WEB開發進階 - Django使用者登入的資訊管理及生命週期簡述

 案例操作: 一、Django編寫模擬使用者登入並跳轉到後臺   示範案例,要求: 1、模擬使用者登入,賬號密碼一致、輸入錯誤的話進行提示 2、使用者登入成功跳轉到後臺,並顯示其他home.html資訊 3、彈出對話方塊,設定新增、刪除按鈕 程式碼結構: 程式碼

JMeter處理器使用詳解(二次開發)

一、外掛下載地址: 百度網盤連結:https://pan.baidu.com/s/1WK7FVzq_PYYd2JEGX92rvQ 提取碼:shnw 二、使用條件 1.JMeter版本為3.3(在JMeter3.3的基礎上開發); 2.將jar包放置到目錄…\lib\ext下重啟J

5.Spring Bean生命週期.md

文章目錄 5.Spring Bean生命週期 生命週期流程圖 說明 總結 5.Spring Bean生命週期 生命週期流程圖 說明 *呼叫InstantitationAwareBeanP

Jmeter入門13 處理器JSON Extractor提取json的多個值

json串[]表示陣列,{}表示物件。 JSON Extractor $表示響應的根物件。取物件或屬性用.,陣列用[],索引從0開始。   示例: 分析響應結果 在請求上點右鍵新增post processors 》 JSON Extractor 1 分號分隔多個引數名,js

提取json響應結果值_處理器JSON Extractor

  Json響應格式     json串中{}表示物件,[]表示陣列 JSON Extractor使用json path表示式匹配,可以一次取多個變數值。 $表示響應的根物件。 取子物件或物件的屬性用.  取數組裡的物件用[],陣