Spring的核心是IOC與AOP,IOC主要是依賴關系的管理,依賴查詢,依賴注入,在之前bean的生命周期文章中已經對bean的生命周期做了相對多的分析,這裡以前探讨下AOP的實作原理。
關鍵類
- AspectJAwareAdvisorAutoProxyCreator Spring啟動時的beanPostProcessor,bean生命周期中經常可以看到beanPostProcessor在起作用,AOP也是基于IOC來實作的。
- DefaultAopProxyFactory.createAopProxy(AdvisedSupport config) 建立AOP代理類,這樣才可以實作AOP
- AopNamespaceHandler aop标簽解析的handler
- ConfigBeanDefinitionParser ,aop config标簽的解析類。
分析
- 首先搭建一個能運作 Spring AOP的demo,參考早期的一篇文章 Spring AOP入門
預覽一下配置檔案

image.png
- 運作方式不變,在 Bean生命周期-執行個體化ApplicationContext 中的運作方式。
// Spring加載配置檔案
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
- spring在啟動的時候加載配置檔案的方式不變,變化的隻是其解析配置檔案的方式,而執行個體化ApplicationContext中加載配置檔案過程
refresh
-> obtainFreshBeanFactory
-> refreshBeanFactory
-> AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)
-> ...
-> XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)
-> DefaultBeanDefinitionDocumentReader.parseBeanDefinitions
以上過程在bean生命周期中都有提到過,以上沒有變化。
差別在于<aop:config>是自定義的标簽,這次走的是parseCustomElement方法
- 找到自定義元素的NamespaceHandler,NamespaceHandler的映射關系定義在
檔案中。Spring各個jar包中的spring.handlers都會生效。META/spring.handlers
NameSpaceHandler的映射關系存儲在DefaultNamespaceHandlerResolver中,自定義的
aop:config
标簽找到的Handler是
AopNamespaceHandler
- AopNamespaceHandler是在namespaceHandlerResolver進行resolve的時候,執行個體化并且調用init方法的,然後AopNamespaceHandler進行parse。
AopNamespaceHandler在parse的時候,找到标簽對應的Parser再進行parse,是以[aop:config]标簽又交給了ConfigBeanDefinitionParser來解析。
// AopNamespaceHandler調用的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内部解析就不相信說明了,這次我們隻是概覽。
- 解析完aop的元素之後,其它的過程仍然和bean生命周期相同,不同之處則在于如果配置了AOP相關标簽,在處理bean的時候,beanPostProcessor在bean生命周期内多處有影響,足以改變bean的結構。
AOP的實作方式基于IOC,通過beanPostProcessor來自定義bean的結構
- 在bean執行個體化完成之後,會調用beanPostProcessor的postProcessAfterInitialization方法,這個生命階段,我們在 Bean生命周期彙總 這篇文章裡也提到過。
AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父類AbstractAutoProxyCreator中實作,其會對已經執行個體化的bean進行wrap。
而對bean進行wrap的時候,就是使用ProxyFactory createAopProxy,最終會走到DefaultAopProxyFactory的createAopProxy方法。
可以看到:
- 如果bean的類是接口或者類是JDK内部的代理類,其使用 JDK的動态代理類
- 其它情況是CGLIB來實作
- 最後生成的HelloWorld長這個樣子。其已經是生成的代理類了,AOP功能已經生效。
- 建立代理類之後,其餘的過程與bean的生命周期基本一緻
總結
aop的功能也是借助spring對bean的管理來實作的,弄明白了bean的整個過程,spring的其它子產品了解起來都會很輕松。