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

Spring Aop 源碼增強獲取分享

 更新時間:2022年05月05日 11:24:44   作者:? 斜月?  ?  
這篇文章主要介紹了Spring Aop 源碼增強獲取分享,文章圍繞主題的內(nèi)容展開Spring Aop的相關(guān)介紹,具有一定的參考價值需要的小伙伴可以參考一下

1 前言

在前文中,已經(jīng)講述了 AOP 的后置處理器使用和方法,在本文中繼續(xù)分享增強信息相關(guān)的源碼,這里才是 AOP 的核心代碼。

2 spring 增強器

之前已經(jīng)講述了 spring AbstractApplicationContext.refresh 方法,在以下方法中都會處理會處理 BeanPostProcessor 接口。

  • invokeBeanFactoryPostProcessors
  • registerBeanPostProcessors
  • finishBeanFactoryInitialization

增強器的獲取,就是提取 @Aspect 注解標記的內(nèi)容,這個操作一般是在后置處理器中進行處理,在 refresh 方法中調(diào)用 finishBeanFactoryInitialization 步驟中進行實現(xiàn),最終可以追溯到 AbstractAutoProxyCreator.postProcessAfterInitialization。Spring 容器中注冊的 AnnotationAwareAspectJAutoProxyCreator 父類就是 AbstractAutoProxyCreator ,繼而調(diào)用 postProcessBeforeInstantiation 方法獲取代理對象。

在實例化之后,初始化之后會調(diào)用 postProcessAfterInitialization 方法,

如下圖所示:

如果有 @Aspect 注解的切面,則將通過 AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean 方法進行獲取并放入緩存中。

這里的 findCandidateAdvisors 方法的解析和追蹤,獲取增強器需要追蹤 AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors() 方法,其又調(diào)用了 BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors() 方法,主要的作用就是為了獲取切面邏輯,即獲取增強器。

在這里 this.advisorFactory.getAdvisors(factory) 是獲取增強器的最終實現(xiàn)方法,在 ReflectiveAspectJAdvisorFactory 工程方法中,可以看到以下內(nèi)容,這里采用的是委托模式:

以上是獲取增強器的核心邏輯,對于如何解析切面邏輯的注解,則還需要從以下方法進行著手分析,主要就是 getPointcut 方法。

在該方法中,主要實現(xiàn)了以下功能:

  • 1 獲取切點的信息,切點信息一般是指獲取注解表達式的信息。
  • 2 根據(jù)切點信息生成增強實現(xiàn),所有的實現(xiàn)類都由 InstantiationModelAwarePointcutAdvisorImpl 進行統(tǒng)一的封裝。

這里的 instantiateAdvice 方法即是獲取切面邏輯

invokeAdviceMethod 這個方法就是實際調(diào)用的方法。

findCandidateAdvisors 查找所有的增強器的解析,但是對于所有的增強器,不一定能適用于當(dāng)前 Bean,還需要挑選適合的增強器,滿足配置的通配符的增強器。這就用到了 findAdvisorsThatCanApply。

BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors() 來獲取所有的 Advisor。其核心邏輯如下圖所示:

  • 1 獲取所有的 beanName,這個 Spring 提供了 BeanFactoryUtils.beanNamesForTypeIncludingAncestors 方法來獲取容器中所有的 beanName 信息。
  • 2 遍歷所有的 beanName , 并找出聲明有 AspectJ 注解的類。
  • 3 對標記為 AspectJ 注解的類進行增強器的提取。
  • 4 將提取增強的結(jié)果放入 advisorsCache 中。

以上便是獲取增強器的全部過程,總結(jié)來說 wrapIfNecessary getAdvicesAndAdvisorsForBean buildAspectJAdvisors 都是核心的方法。

3 總結(jié)

本文講了獲取增強信息獲取的源碼,主要核心方法為wrapIfNecessarygetAdvicesAndAdvisorsForBean buildAspectJAdvisors,在后續(xù)文中將繼續(xù) AOP 代碼的分享。

到此這篇關(guān)于Spring Aop 源碼增強獲取分享的文章就介紹到這了,更多相關(guān)Spring Aop內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring boot配置文件加解密詳解

    Spring boot配置文件加解密詳解

    這篇文章主要給大家介紹了關(guān)于Spring boot配置文件加解密的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java框架Quartz中的Trigger簡析

    Java框架Quartz中的Trigger簡析

    這篇文章主要介紹了Java框架Quartz中的Trigger簡析,所有類型的trigger都有TriggerKey這個屬性,表示trigger的身份;除此之外,trigger還有很多其它的公共屬性,這些屬性,在構(gòu)建trigger的時候可以通過TriggerBuilder設(shè)置,需要的朋友可以參考下
    2023-11-11
  • Java枚舉類型與泛型使用解讀

    Java枚舉類型與泛型使用解讀

    這篇文章主要介紹了Java枚舉類型與泛型使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 使用Spring自定義命名空間

    使用Spring自定義命名空間

    這篇文章主要介紹了使用Spring自定義命名空間方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java enum的用法詳細介紹及實例代碼

    Java enum的用法詳細介紹及實例代碼

    這篇文章主要介紹了Java enum的用法詳細介紹及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringBoot整合Shiro思路(最新超詳細)

    SpringBoot整合Shiro思路(最新超詳細)

    這篇文章主要介紹了SpringBoot整合Shiro思路(最新超詳細),本文內(nèi)容比較長,通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • VSCode+Gradle搭建Java開發(fā)環(huán)境實現(xiàn)

    VSCode+Gradle搭建Java開發(fā)環(huán)境實現(xiàn)

    這篇文章主要介紹了VSCode+Gradle搭建Java開發(fā)環(huán)境實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java制作專屬智能陪聊機器人詳解

    java制作專屬智能陪聊機器人詳解

    人工智能一直是最近的熱點話題,,這篇文章主要為大家詳細介紹了java實現(xiàn)智能陪聊機器人,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java工程如何打印程序日志過程解析

    Java工程如何打印程序日志過程解析

    這篇文章主要介紹了Java工程如何打印程序日志過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • 基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式)

    基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式)

    這篇文章主要介紹了基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

阆中市| 漠河县| 通海县| 道真| 磐石市| 金乡县| 莱州市| 鄂尔多斯市| 商城县| 黔西县| 甘南县| 东宁县| 南昌县| 涪陵区| 民乐县| 黎城县| 南京市| 沁源县| 博客| 恭城| 嘉黎县| 温泉县| 灌阳县| 阜阳市| 肃南| 长顺县| 乌拉特中旗| 高唐县| 大余县| 通州市| 岳池县| 鄂托克前旗| 呼玛县| 库尔勒市| 福清市| 吉木萨尔县| 屯门区| 黄山市| 桑植县| 永仁县| 霍山县|