Spring的核心是IOC與AOP逾雄,IOC主要是依賴關系的管理阀溶,依賴查詢腻脏,依賴注入,在之前bean的生命周期文章中已經(jīng)對bean的生命周期做了相對多的分析银锻,這里以前探討下AOP的實現(xiàn)原理永品。
關鍵類
- AspectJAwareAdvisorAutoProxyCreator Spring啟動時的beanPostProcessor,bean生命周期中經(jīng)郴魑常可以看到beanPostProcessor在起作用鼎姐,AOP也是基于IOC來實現(xiàn)的。
- DefaultAopProxyFactory.createAopProxy(AdvisedSupport config) 創(chuàng)建AOP代理類更振,這樣才可以實現(xiàn)AOP
- AopNamespaceHandler aop標簽解析的handler
- ConfigBeanDefinitionParser ,aop config標簽的解析類炕桨。
分析
- 首先搭建一個能運行 Spring AOP的demo,參考早期的一篇文章Spring AOP入門
預覽一下配置文件
- 運行方式不變肯腕,在Bean生命周期-實例化ApplicationContext中的運行方式谋作。
// Spring加載配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
- spring在啟動的時候加載配置文件的方式不變,變化的只是其解析配置文件的方式乎芳,而實例化ApplicationContext中加載配置文件過程
refresh
-> obtainFreshBeanFactory
-> refreshBeanFactory
-> AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)
-> ...
-> XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
-> DefaultBeanDefinitionDocumentReader.parseBeanDefinitions
以上過程在bean生命周期中都有提到過遵蚜,以上沒有變化。
區(qū)別在于<aop:config>是自定義的標簽奈惑,這次走的是parseCustomElement方法
- 找到自定義元素的NamespaceHandler吭净,NamespaceHandler的映射關系定義在
META/spring.handlers
文件中铐尚。Spring各個jar包中的spring.handlers都會生效蟆肆。
NameSpaceHandler的映射關系存儲在DefaultNamespaceHandlerResolver中今穿,自定義的aop:config
標簽找到的Handler是AopNamespaceHandler
- AopNamespaceHandler是在namespaceHandlerResolver進行resolve的時候蒋川,實例化并且調(diào)用init方法的擎勘,然后AopNamespaceHandler進行parse硝全。
AopNamespaceHandler在parse的時候批糟,找到標簽對應的Parser再進行parse赚爵,因此[aop:config]標簽又交給了ConfigBeanDefinitionParser來解析庶柿。
// AopNamespaceHandler調(diào)用的parse方法
public BeanDefinition parse(Element element, ParserContext parserContext) {
return findParserForElement(element, parserContext).parse(element, parserContext);
}
- ConfigBeanDefinitionParser的解析過程村怪,其剛開始配置configureAutoProxyCreator,會配置AspectJAwareAdvisorAutoProxyCreator這個類做為spring的bean浮庐。
ConfigBeanDefinitionParser.parse
-> configureAutoProxyCreator
-> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element)
-> ...
- 在解析其它標簽的時候甚负,大致都是注冊一個bean,pointcut,advisor审残,aspect內(nèi)部解析就不相信說明了梭域,這次我們只是概覽。
- 解析完aop的元素之后搅轿,其它的過程仍然和bean生命周期相同病涨,不同之處則在于如果配置了AOP相關標簽,在處理bean的時候璧坟,beanPostProcessor在bean生命周期內(nèi)多處有影響既穆,足以改變bean的結(jié)構(gòu)赎懦。
AOP的實現(xiàn)方式基于IOC,通過beanPostProcessor來自定義bean的結(jié)構(gòu)
- 在bean實例化完成之后循衰,會調(diào)用beanPostProcessor的postProcessAfterInitialization方法铲敛,這個生命階段,我們在Bean生命周期匯總這篇文章里也提到過会钝。
AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父類AbstractAutoProxyCreator中實現(xiàn)伐蒋,其會對已經(jīng)實例化的bean進行wrap。
而對bean進行wrap的時候迁酸,就是使用ProxyFactory createAopProxy先鱼,最終會走到DefaultAopProxyFactory的createAopProxy方法。
可以看到:
- 如果bean的類是接口或者類是JDK內(nèi)部的代理類奸鬓,其使用 JDK的動態(tài)代理類
- 其它情況是CGLIB來實現(xiàn)
- 最后生成的HelloWorld長這個樣子焙畔。其已經(jīng)是生成的代理類了,AOP功能已經(jīng)生效串远。
- 創(chuàng)建代理類之后宏多,其余的過程與bean的生命周期基本一致
總結(jié)
aop的功能也是借助spring對bean的管理來實現(xiàn)的,弄明白了bean的整個過程澡罚,spring的其它模塊理解起來都會很輕松伸但。