Spring Aop 源碼增強獲取分享
1 前言
在前文中,已經(jīng)講述了 AOP 的后置處理器使用和方法,在本文中繼續(xù)分享增強信息相關的源碼,這里才是 AOP 的核心代碼。
2 spring 增強器
之前已經(jīng)講述了 spring AbstractApplicationContext.refresh
方法,在以下方法中都會處理會處理 BeanPostProcessor
接口。
invokeBeanFactoryPostProcessors
registerBeanPostProcessors
finishBeanFactoryInitialization
增強器的獲取,就是提取 @Aspect
注解標記的內容,這個操作一般是在后置處理器中進行處理,在 refresh 方法中調用 finishBeanFactoryInitialization
步驟中進行實現(xiàn),最終可以追溯到 AbstractAutoProxyCreator.postProcessAfterInitialization
。Spring 容器中注冊的 AnnotationAwareAspectJAutoProxyCreator
父類就是 AbstractAutoProxyCreator
,繼而調用 postProcessBeforeInstantiation
方法獲取代理對象。
在實例化之后,初始化之后會調用 postProcessAfterInitialization
方法,
如下圖所示:
如果有 @Aspect
注解的切面,則將通過 AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean
方法進行獲取并放入緩存中。
這里的 findCandidateAdvisors
方法的解析和追蹤,獲取增強器需要追蹤 AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
方法,其又調用了 BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
方法,主要的作用就是為了獲取切面邏輯,即獲取增強器。
在這里
this.advisorFactory.getAdvisors(factory)
是獲取增強器的最終實現(xiàn)方法,在 ReflectiveAspectJAdvisorFactory
工程方法中,可以看到以下內容,這里采用的是委托模式:
以上是獲取增強器的核心邏輯,對于如何解析切面邏輯的注解,則還需要從以下方法進行著手分析,主要就是 getPointcut
方法。
在該方法中,主要實現(xiàn)了以下功能:
- 1 獲取切點的信息,切點信息一般是指獲取注解表達式的信息。
- 2 根據(jù)切點信息生成增強實現(xiàn),所有的實現(xiàn)類都由
InstantiationModelAwarePointcutAdvisorImpl
進行統(tǒng)一的封裝。
這里的 instantiateAdvice
方法即是獲取切面邏輯
invokeAdviceMethod
這個方法就是實際調用的方法。
findCandidateAdvisors
查找所有的增強器的解析,但是對于所有的增強器,不一定能適用于當前 Bean,還需要挑選適合的增強器,滿足配置的通配符的增強器。這就用到了 findAdvisorsThatCanApply
。
BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
來獲取所有的 Advisor。其核心邏輯如下圖所示:
- 1 獲取所有的 beanName,這個 Spring 提供了
BeanFactoryUtils.beanNamesForTypeIncludingAncestors
方法來獲取容器中所有的 beanName 信息。 - 2 遍歷所有的 beanName , 并找出聲明有 AspectJ 注解的類。
- 3 對標記為 AspectJ 注解的類進行增強器的提取。
- 4 將提取增強的結果放入 advisorsCache 中。
以上便是獲取增強器的全部過程,總結來說 wrapIfNecessary
getAdvicesAndAdvisorsForBean
buildAspectJAdvisors
都是核心的方法。
3 總結
本文講了獲取增強信息獲取的源碼,主要核心方法為wrapIfNecessary
getAdvicesAndAdvisorsForBean
buildAspectJAdvisors
,在后續(xù)文中將繼續(xù) AOP 代碼的分享。
到此這篇關于Spring Aop 源碼增強獲取分享的文章就介紹到這了,更多相關Spring Aop內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Javaweb實現(xiàn)在線人數(shù)統(tǒng)計代碼實例
這篇文章主要介紹了Javaweb實現(xiàn)在線人數(shù)統(tǒng)計代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11Springmvc ResponseBody響應json數(shù)據(jù)實現(xiàn)過程
這篇文章主要介紹了Springmvc ResponseBody響應json數(shù)據(jù)實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題
這篇文章主要介紹了解決idea中Terminal終端無法執(zhí)行GIT命令+Terminal 中文亂碼問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07深入理解java內置鎖(synchronized)和顯式鎖(ReentrantLock)
這篇文章主要介紹了Java多線程之內置鎖(synchronized)和顯式鎖(ReentrantLock)的深入理解新的和用法,具有一定參考價值,需要的朋友可以了解下。2017-11-11