Spring AOP實(shí)現(xiàn)原理分析

Spring的核心是IOC與AOP,IOC主要是依賴關(guān)系的管理,依賴查詢,依賴注入,在之前bean的生命周期文章中已經(jīng)對(duì)bean的生命周期做了相對(duì)多的分析,這里以前探討下AOP的實(shí)現(xiàn)原理。

關(guān)鍵類

  • AspectJAwareAdvisorAutoProxyCreator Spring啟動(dòng)時(shí)的beanPostProcessor,bean生命周期中經(jīng)??梢钥吹絙eanPostProcessor在起作用,AOP也是基于IOC來實(shí)現(xiàn)的。
  • DefaultAopProxyFactory.createAopProxy(AdvisedSupport config) 創(chuàng)建AOP代理類,這樣才可以實(shí)現(xiàn)AOP
  • AopNamespaceHandler aop標(biāo)簽解析的handler
  • ConfigBeanDefinitionParser ,aop config標(biāo)簽的解析類。

分析

  1. 首先搭建一個(gè)能運(yùn)行 Spring AOP的demo,參考早期的一篇文章Spring AOP入門

預(yù)覽一下配置文件


image.png
  1. 運(yùn)行方式不變,在Bean生命周期-實(shí)例化ApplicationContext中的運(yùn)行方式。
// Spring加載配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
  1. spring在啟動(dòng)的時(shí)候加載配置文件的方式不變,變化的只是其解析配置文件的方式,而實(shí)例化ApplicationContext中加載配置文件過程

refresh
-> obtainFreshBeanFactory
-> refreshBeanFactory
-> AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)
-> ...
-> XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
-> DefaultBeanDefinitionDocumentReader.parseBeanDefinitions

以上過程在bean生命周期中都有提到過,以上沒有變化。

區(qū)別在于<aop:config>是自定義的標(biāo)簽,這次走的是parseCustomElement方法

image.png

  1. 找到自定義元素的NamespaceHandler,NamespaceHandler的映射關(guān)系定義在 META/spring.handlers文件中。Spring各個(gè)jar包中的spring.handlers都會(huì)生效。

NameSpaceHandler的映射關(guān)系存儲(chǔ)在DefaultNamespaceHandlerResolver中,自定義的aop:config標(biāo)簽找到的Handler是AopNamespaceHandler

image.png
  1. AopNamespaceHandler是在namespaceHandlerResolver進(jìn)行resolve的時(shí)候,實(shí)例化并且調(diào)用init方法的,然后AopNamespaceHandler進(jìn)行parse。
image.png

AopNamespaceHandler在parse的時(shí)候,找到標(biāo)簽對(duì)應(yīng)的Parser再進(jìn)行parse,因此[aop:config]標(biāo)簽又交給了ConfigBeanDefinitionParser來解析。

  // AopNamespaceHandler調(diào)用的parse方法
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        return findParserForElement(element, parserContext).parse(element, parserContext);
    }
  1. ConfigBeanDefinitionParser的解析過程,其剛開始配置configureAutoProxyCreator,會(huì)配置AspectJAwareAdvisorAutoProxyCreator這個(gè)類做為spring的bean。

ConfigBeanDefinitionParser.parse
-> configureAutoProxyCreator
-> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element)
-> ...

image.png
  1. 在解析其它標(biāo)簽的時(shí)候,大致都是注冊(cè)一個(gè)bean,pointcut,advisor,aspect內(nèi)部解析就不相信說明了,這次我們只是概覽。
image.png
  1. 解析完aop的元素之后,其它的過程仍然和bean生命周期相同,不同之處則在于如果配置了AOP相關(guān)標(biāo)簽,在處理bean的時(shí)候,beanPostProcessor在bean生命周期內(nèi)多處有影響,足以改變bean的結(jié)構(gòu)。

AOP的實(shí)現(xiàn)方式基于IOC,通過beanPostProcessor來自定義bean的結(jié)構(gòu)

image.png
  1. 在bean實(shí)例化完成之后,會(huì)調(diào)用beanPostProcessor的postProcessAfterInitialization方法,這個(gè)生命階段,我們?cè)?a href="http://www.itdecent.cn/p/be38b73fe690" target="_blank">Bean生命周期匯總這篇文章里也提到過。

AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父類AbstractAutoProxyCreator中實(shí)現(xiàn),其會(huì)對(duì)已經(jīng)實(shí)例化的bean進(jìn)行wrap。

而對(duì)bean進(jìn)行wrap的時(shí)候,就是使用ProxyFactory createAopProxy,最終會(huì)走到DefaultAopProxyFactory的createAopProxy方法。

可以看到:

  • 如果bean的類是接口或者類是JDK內(nèi)部的代理類,其使用 JDK的動(dòng)態(tài)代理類
  • 其它情況是CGLIB來實(shí)現(xiàn)
image.png
  1. 最后生成的HelloWorld長這個(gè)樣子。其已經(jīng)是生成的代理類了,AOP功能已經(jīng)生效。
image.png
  1. 創(chuàng)建代理類之后,其余的過程與bean的生命周期基本一致

總結(jié)

aop的功能也是借助spring對(duì)bean的管理來實(shí)現(xiàn)的,弄明白了bean的整個(gè)過程,spring的其它模塊理解起來都會(huì)很輕松。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記,整理的知識(shí)點(diǎn),也是為了防止忘記,尊重勞動(dòng)成果,轉(zhuǎn)載注明出處哦!如果你也喜歡,那...
    波波波先森閱讀 12,444評(píng)論 6 86
  • 1.1 Spring IoC容器和bean簡(jiǎn)介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,672評(píng)論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評(píng)論 19 139
  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,851評(píng)論 2 22
  • 本來是準(zhǔn)備看一看Spring源碼的。然后在知乎上看到來一個(gè)帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 7,044評(píng)論 4 21

友情鏈接更多精彩內(nèi)容