最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring源碼解析后置處理器梳理總結(jié)

 更新時間:2022年07月07日 11:06:21   作者:??碼農(nóng)參上??  
這篇文章主要介紹了Spring源碼解析后置處理器梳理總結(jié),在前面幾篇文章中梳理了Spring中bean的創(chuàng)建過程,在這個過程中各式各樣的后置處理器發(fā)揮了不同的作用,可以說后置處理器貫穿了bean的實例化以及初始化過程

前言

在前面幾篇文章中梳理了Spring中bean的創(chuàng)建過程,在這個過程中各式各樣的后置處理器發(fā)揮了不同的作用,可以說后置處理器貫穿了bean的實例化以及初始化過程。在這篇文章中,將按照出場順序?qū)笾锰幚砥髯饔脠鼍凹鞍l(fā)揮功能進行梳理。

1、InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法

AbstractAutowireCapableBeanFactory 的createBean方法中調(diào)用,這時bean還沒有被實例化:

調(diào)用resolveBeforeInstantiation方法:

applyBeanPostProcessorsBeforeInstantiation方法:

在這里,首先拿到spring中提供的所有后置處理器,判斷是不是InstantiationAwareBeanPostProcessor。該后置處理器實現(xiàn)了BeanPostProcessor,在這調(diào)用了postProcessBeforeInstantiation方法。

這里在目標對象被spring實例化之前調(diào)用,postProcessBeforeInstantiation方法的返回值類型是Object,可以返回任何類型的值。由于此時目標對象還未實例化,所以這個返回值可以用來代替原本該生成的目標對象的實例,一般為代理對象。

如果該方法的返回的Object對象代替了原本該生成的目標對象,那么就會把返回的對象放到單例池當中緩存,后續(xù)只有BeanPostProcessorpostProcessAfterInitialization方法會調(diào)用,其它方法不再調(diào)用。

如果這里返回了null,就按照正常的流程創(chuàng)建對象,交給spring去負責對象的實例化。因此這個方法可以判斷這個對象在spring實例化之前是否要做特殊的處理,比如不交給Spring管理,自己使用代理產(chǎn)生。

2、SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法

AbstractAutowireCapableBeanFactory 的createBeanInstance方法中調(diào)用:

determineConstructorsFromBeanPostProcessors方法,該方法用于推斷實例化的構(gòu)造方法,這里可能檢測出bean擁有多個候選構(gòu)造方法:

SmartInstantiationAwareBeanPostProcessor接口的實現(xiàn)類AutowiredAnnotationBeanPostProcessor負責完成這個過程,如果有多個構(gòu)造方法的情況下,ctors會返回空,后續(xù)使用默認無參構(gòu)造方法進行實例化。但是如果有一個構(gòu)造方法上有@Autowired注解,spring會優(yōu)先選擇這個方法。

3、MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition()方法

AbstractAutowireCapableBeanFactorydoCreateBean方法中調(diào)用:

applyMergedBeanDefinitionPostProcessors方法:

在方法中對所有實現(xiàn)了MergedBeanDefinitionPostProcessor接口的后置處理器進行遍歷,這里具體調(diào)用AutowiredAnnotationBeanPostProcessor,用于掃描需要注入的屬性。

AutowiredAnnotationBeanPostProcessor中,定義了兩種需要掃描的注解類型,@Autowired@Value

findAutowiredAnnotation方法中:

對正在創(chuàng)建的bean進行掃描,如果有屬性和方法上面加了這兩個注解,就會把對應的方法或者屬性保存,最終在buildAutowiringMetadata方法中封裝成InjectionMetadata對象。

需要注意這里的后置處理器僅僅用于掃描及緩存bean的注入信息,這里只完成了查找功能,沒有完成屬性的注入,屬性的注入是在之后的另外的后置處理器中完成的。

4、SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference()方法

AbstractAutowireCapableBeanFactorydoCreateBean 方法中調(diào)用,主要用于處理Bean的循環(huán)依賴:

在產(chǎn)生循環(huán)依賴后調(diào)用getEarlyBeanReference方法:

在這里遍歷后置處理器,得到經(jīng)過后置處理器代理后的對象,放入spring的二級緩存當中,提前暴露供循環(huán)引用的情況調(diào)用。注意這里返回的僅僅是一個對象,還算不上是一個完整的bean對象。這個具體調(diào)用過程在上一篇講循環(huán)依賴的中的文章中講的比較詳細,如果有不明白的可以回顧一下。

5、InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法

AbstractAutowireCapableBeanFactorypopulateBean方法中調(diào)用:

populateBean方法中:

該方法在目標對象實例化之后調(diào)用,這個時候?qū)ο笠呀?jīng)被實例化,但是該實例的屬性還未被設置,都是null。

這里遍歷后置處理器,如果實現(xiàn)了InstantiationAwareBeanPostProcessor,那么就調(diào)用postProcessAfterInstantiation方法。如果方法返回值為true,按照正常流程進行屬性值的填充;如果該方法返回false,會忽略屬性值的設置過程。簡而言之,該后置處理器用于判斷當前實例化完成的bean需不需要進行屬性填充。

6、InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法

同樣在populateBean方法中,在postProcessAfterInstantiation后返回true時執(zhí)行,如果方法返回false,該方法不會被調(diào)用。

遍歷后置處理器,如果屬于InstantiationAwareBeanPostProcessor類型,則調(diào)用它的postProcessPropertyValues方法。

這里發(fā)揮作用的是AutowiredAnnotationBeanPostProcessor,負責對添加了 @Autowired@Value等注解的屬性進行依賴的填充。在其中遍歷所有需要注入的屬性的列表,使用反射將注入的bean實例賦值給屬性。(具體過程參照Spring實例化Bean源碼解析)

7、BeanPostProcessor的postProcessBeforeInitialization()方法

AbstractAutowireCapableBeanFactory的doCreateBean方法中調(diào)用initializeBeanfan方法:

applyBeanPostProcessorsBeforeInitialization方法中:

在該方法中,遍歷執(zhí)行所有BeanPostProcessorpostProcessBeforeInitialization方法。

在執(zhí)行該方法前,bean已經(jīng)被實例化完成,并且完成了屬性的填充,因此這個過程屬于后續(xù)的bean的初始化過程。

需要注意的是,如果在bean中有方法被標注了@PostContrust注解,那么在CommonAnnotationBeanPostProcessor中,會調(diào)用該@PostContrust方法。

8、BeanPostProcessor的postProcessAfterInitialization()方法

和第7次調(diào)用入口相同,也是在AbstractAutowireCapableBeanFactoryinitializeBean方法中:

applyBeanPostProcessorsAfterInitialization方法中:

遍歷執(zhí)行所有BeanPostProcessorpostProcessAfterInitialization方法。綜上所述,bean的各種方法執(zhí)行屬性為,先執(zhí)行構(gòu)造方法,再執(zhí)行后置管理器中的before方法及@PostContrust方法,最后執(zhí)行后置處理器的after方法。

9、InitDestroyAnnotationBeanPostProcessor的postProcessBeforeDestruction()方法

如果當前bean中有方法被@PreDestroy注解標注,那么當Spring的ApplicationContext執(zhí)行close方法時調(diào)用該后置處理器。在DefaultSingletonBeanRegistry中執(zhí)行destroyBean方法:

調(diào)用destroy方法:

InitDestroyAnnotationBeanPostProcessorpostProcessBeforeDestruction方法:

在該方法中,調(diào)用@PreDestroy注解標注的方法,執(zhí)行銷毀方法。

總結(jié)

本文對貫穿bean的實例化及初始化過程中出現(xiàn)的后置處理器進行了一下梳理,但是還有很多其他的后置處理器沒有講到??梢哉f后置處理器是spring提供給使用者的一些擴展點,如果能夠熟練的使用這些后置處理器,能夠幫助我們接觸到一些spring中比較深層的東西,并對spring中的生命周期進行有利的插手。

相關(guān)文章

  • Java?回調(diào)callback舉例詳解

    Java?回調(diào)callback舉例詳解

    這篇文章主要介紹了Java?回調(diào)callback舉例詳解,軟件模塊之間總是存在一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用
    2022-09-09
  • Java getRealPath(

    Java getRealPath("/")與getContextPath()區(qū)別詳細分析

    這篇文章主要介紹了Java getRealPath("/")與getContextPath()區(qū)別詳細分析,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 零基礎寫Java知乎爬蟲之準備工作

    零基礎寫Java知乎爬蟲之準備工作

    上個系列我們從易到難介紹了如何使用python編寫爬蟲,小伙伴們反響挺大,這個系列我們來研究下使用Java編寫知乎爬蟲,小伙伴們可以對比這看下。
    2014-11-11
  • Java JDK與cglib動態(tài)代理有什么區(qū)別

    Java JDK與cglib動態(tài)代理有什么區(qū)別

    這篇文章主要介紹了Java JDK動態(tài)代理和cglib動態(tài)代理的區(qū)別文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03
  • java必懂的冷知識點之Base64加密與解密

    java必懂的冷知識點之Base64加密與解密

    這篇文章主要介紹了java必懂的冷知識點之Base64加密與解密的相關(guān)資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java 8新特性方法引用詳細介紹

    Java 8新特性方法引用詳細介紹

    這篇文章主要介紹了Java 8新特性方法引用詳細介紹的相關(guān)資料,這里對新特性 方法引用做的資料整理,具有參考價值,需要的朋友可以參考下
    2016-12-12
  • 淺談java多線程wait,notify

    淺談java多線程wait,notify

    這篇文章主要介紹了java多線程wait,notify,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面小編和大家一起來學習一下吧
    2019-05-05
  • Java實現(xiàn)http請求文件流對帶寬限速獲取md5值

    Java實現(xiàn)http請求文件流對帶寬限速獲取md5值

    文章介紹了如何在進行HTTP請求下載大數(shù)據(jù)時處理帶寬限制和并發(fā)問題,通過使用緩沖區(qū)和限速邏輯,可以有效控制下載速度,避免掉包和數(shù)據(jù)丟失,核心公式基于帶寬和已下載字節(jié)數(shù)計算預期耗時,并通過Thread.sleep()進行動態(tài)休眠補償,感興趣的朋友一起看看吧
    2025-02-02
  • SpringCloudGateway開發(fā)過程解析

    SpringCloudGateway開發(fā)過程解析

    這篇文章主要介紹了SpringCloudGateway開發(fā)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Spring Boot項目中jar包在服務器上啟動的正確姿勢

    Spring Boot項目中jar包在服務器上啟動的正確姿勢

    這篇文章主要給大家介紹了關(guān)于Spring Boot項目中jar包在服務器上啟動的正確姿勢,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01

最新評論

政和县| 庆阳市| 山西省| 得荣县| 巢湖市| 柳江县| 杭锦旗| 汝城县| 通州区| 开封县| 九台市| 贺州市| 南投市| 务川| 泽普县| 万全县| 娄烦县| 丰镇市| 乌拉特中旗| 锡林郭勒盟| 泰安市| 新巴尔虎右旗| 安徽省| 仪征市| 泽州县| 临澧县| 徐汇区| 龙游县| 孝昌县| 阿荣旗| 阿坝县| 台南县| 桃园县| 印江| 清原| 大埔县| 布尔津县| 金川县| 修武县| 龙井市| 健康|