天天看點

Spring AOP實作原理分析

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标簽的解析類。

分析

  1. 首先搭建一個能運作 Spring AOP的demo,參考早期的一篇文章 Spring AOP入門

預覽一下配置檔案

Spring AOP實作原理分析

image.png

  1. 運作方式不變,在 Bean生命周期-執行個體化ApplicationContext 中的運作方式。
// Spring加載配置檔案
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("app.xml");
           
  1. spring在啟動的時候加載配置檔案的方式不變,變化的隻是其解析配置檔案的方式,而執行個體化ApplicationContext中加載配置檔案過程

refresh

-> obtainFreshBeanFactory

-> refreshBeanFactory

-> AbstractRefreshableApplicationContext.loadBeanDefinitions(beanFactory)

-> ...

-> XmlBeanDefinitionReader.loadBeanDefinitions(Resource resource)

-> DefaultBeanDefinitionDocumentReader.parseBeanDefinitions

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

差別在于<aop:config>是自定義的标簽,這次走的是parseCustomElement方法

Spring AOP實作原理分析
  1. 找到自定義元素的NamespaceHandler,NamespaceHandler的映射關系定義在

    META/spring.handlers

    檔案中。Spring各個jar包中的spring.handlers都會生效。

NameSpaceHandler的映射關系存儲在DefaultNamespaceHandlerResolver中,自定義的

aop:config

标簽找到的Handler是

AopNamespaceHandler

Spring AOP實作原理分析
  1. AopNamespaceHandler是在namespaceHandlerResolver進行resolve的時候,執行個體化并且調用init方法的,然後AopNamespaceHandler進行parse。
Spring AOP實作原理分析

AopNamespaceHandler在parse的時候,找到标簽對應的Parser再進行parse,是以[aop:config]标簽又交給了ConfigBeanDefinitionParser來解析。

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

ConfigBeanDefinitionParser.parse

-> configureAutoProxyCreator

-> AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element)

Spring AOP實作原理分析
  1. 在解析其它标簽的時候,大緻都是注冊一個bean,pointcut,advisor,aspect内部解析就不相信說明了,這次我們隻是概覽。
Spring AOP實作原理分析
  1. 解析完aop的元素之後,其它的過程仍然和bean生命周期相同,不同之處則在于如果配置了AOP相關标簽,在處理bean的時候,beanPostProcessor在bean生命周期内多處有影響,足以改變bean的結構。

AOP的實作方式基于IOC,通過beanPostProcessor來自定義bean的結構

Spring AOP實作原理分析
  1. 在bean執行個體化完成之後,會調用beanPostProcessor的postProcessAfterInitialization方法,這個生命階段,我們在 Bean生命周期彙總 這篇文章裡也提到過。

AspectJAwareAdvisorAutoProxyCreator的postProcessAfterInitialization方法再其父類AbstractAutoProxyCreator中實作,其會對已經執行個體化的bean進行wrap。

而對bean進行wrap的時候,就是使用ProxyFactory createAopProxy,最終會走到DefaultAopProxyFactory的createAopProxy方法。

可以看到:

  • 如果bean的類是接口或者類是JDK内部的代理類,其使用 JDK的動态代理類
  • 其它情況是CGLIB來實作
Spring AOP實作原理分析
  1. 最後生成的HelloWorld長這個樣子。其已經是生成的代理類了,AOP功能已經生效。
Spring AOP實作原理分析
  1. 建立代理類之後,其餘的過程與bean的生命周期基本一緻

總結

aop的功能也是借助spring對bean的管理來實作的,弄明白了bean的整個過程,spring的其它子產品了解起來都會很輕松。