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)簽的解析類。
分析
- 首先搭建一個(gè)能運(yùn)行 Spring AOP的demo,參考早期的一篇文章Spring AOP入門
預(yù)覽一下配置文件

- 運(yùn)行方式不變,在Bean生命周期-實(shí)例化ApplicationContext中的運(yùn)行方式。
// Spring加載配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
- 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方法

- 找到自定義元素的NamespaceHandler,NamespaceHandler的映射關(guān)系定義在
META/spring.handlers文件中。Spring各個(gè)jar包中的spring.handlers都會(huì)生效。
NameSpaceHandler的映射關(guān)系存儲(chǔ)在DefaultNamespaceHandlerResolver中,自定義的aop:config標(biāo)簽找到的Handler是AopNamespaceHandler

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

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);
}
- ConfigBeanDefinitionParser的解析過程,其剛開始配置configureAutoProxyCreator,會(huì)配置AspectJAwareAdvisorAutoProxyCreator這個(gè)類做為spring的bean。
ConfigBeanDefinitionParser.parse
-> configureAutoProxyCreator
-> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element)
-> ...

- 在解析其它標(biāo)簽的時(shí)候,大致都是注冊(cè)一個(gè)bean,pointcut,advisor,aspect內(nèi)部解析就不相信說明了,這次我們只是概覽。

- 解析完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)

- 在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)

- 最后生成的HelloWorld長這個(gè)樣子。其已經(jīng)是生成的代理類了,AOP功能已經(jīng)生效。

- 創(chuàng)建代理類之后,其余的過程與bean的生命周期基本一致
總結(jié)
aop的功能也是借助spring對(duì)bean的管理來實(shí)現(xiàn)的,弄明白了bean的整個(gè)過程,spring的其它模塊理解起來都會(huì)很輕松。