亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Aop 源碼增強(qiáng)獲取分享

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

1 前言

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

2 spring 增強(qiáng)器

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

  • invokeBeanFactoryPostProcessors
  • registerBeanPostProcessors
  • finishBeanFactoryInitialization

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

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

如下圖所示:

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

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

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

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

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

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

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

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

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

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

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

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

3 總結(jié)

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

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

相關(guān)文章

  • 基于java讀取并引用自定義配置文件

    基于java讀取并引用自定義配置文件

    這篇文章主要介紹了基于java讀取并引用自定義配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例

    Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例

    這篇文章主要介紹了Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Mybatis詳細(xì)對比一級(jí)緩存與二級(jí)緩存

    Mybatis詳細(xì)對比一級(jí)緩存與二級(jí)緩存

    MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制,緩存可以極大的提升查詢效率。MyBatis中默認(rèn)定義了兩級(jí)緩存,分別是一級(jí)緩存和二級(jí)緩存
    2022-10-10
  • Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    這篇文章主要介紹了Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • HashMap原理的深入理解

    HashMap原理的深入理解

    這篇文章主要介紹了對HashMap原理的理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java 解析user-agent 信息

    java 解析user-agent 信息

    這篇文章主要介紹了java 解析http user-agent的信息的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題

    解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題

    這篇文章主要介紹了解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 深入理解java內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)

    深入理解java內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)

    這篇文章主要介紹了Java多線程之內(nèi)置鎖(synchronized)和顯式鎖(ReentrantLock)的深入理解新的和用法,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 徹底了解java中ReentrantLock和AQS的源碼

    徹底了解java中ReentrantLock和AQS的源碼

    這篇文章主要介紹了徹底了解java中ReentrantLock和AQS的源碼,想了解鎖機(jī)制的同學(xué),一定要參考下
    2021-04-04
  • springboot解決XSS存儲(chǔ)型漏洞問題

    springboot解決XSS存儲(chǔ)型漏洞問題

    這篇文章主要介紹了springboot解決XSS存儲(chǔ)型漏洞問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論