现在的位置: 首页 > 综合 > 正文

《Spring技术内幕》学习笔记9——AOP通知以及编程式AOP

2013年10月02日 ⁄ 综合 ⁄ 共 15517字 ⁄ 字号 评论关闭

1.处理AOP配置的通知基本步骤:

(1).获取AOP配置的通知Advice

从上一篇博客《创建AOP代理对象并对目标对象切面拦截》对Spring中采用JDKCGLIB两种方式创建AOP动态代理的源码分析中,我们了解到,在AOP动态代理对象的回调方法中,都需要使用以下方式获取AOP配置的通知,并将获取到的通知和目标对象、代理对象等一起封装为ReflectiveMethodInvocation对象:

(2).创建ReflectiveMethodInvocation对象:

a.创建CglibMethodInvocation对象:

CglibMethodInvocation继承ReflectiveMethodInvocation类,在创建时首先调用父类的初始化方法。

b.创建ReflectiveMethodInvocation对象:

(3).处理AOP配置的通知器:

Spring通过调用ReflectiveMethodInvocation类来处理AOP配置的通知,CglibMethodInvocation继承ReflectiveMethodInvocation,因此JDKCGLIB方式都是通过调用ReflectiveMethodInvocationproceed()方法来处理通知的,处理通知的源码如下:

2.AOP代理创建辅助类AdvisedSupport获取通知:

1中我们看到,获取AOP通知的的方法如下:

该方法会通过AOP代理创建辅助类AdvisedSupport获取AOP配置的通知,获取通知的过程如下:

(1).AdvisedSupport获取给定方法的通知:

通过上面的源码我们看到,AdvisedSupport第一次获取通知时,会从通知链容器DefaultAdvisorChainFactory中通过getInterceptorsAndDynamicInterceptionAdvice方法获取指定的通知。

(2).DefaultAdvisorChainFactory获取指类,指定方法的通知:

DefaultAdvisorChainFactory通过getInterceptorsAndDynamicInterceptionAdvice方法获取指定类中指定方法的通知,源码如下:

通过上面DefaultAdvisorChainFactory获取通知过程源码的分析,我们看到通过AdvisorAdapterRegistrygetInterceptors方法获取通知器的通知,AdvisorAdapterRegistry是一个接口,具体的实现交由其实现类DefaultAdvisorAdapterRegistry提供。

3.DefaultAdvisorAdapterRegistry获取通知器的通知:

DefaultAdvisorAdapterRegistry的源码如下:

从上述代码获取通知源码分析中我们看到,DefaultAdvisorAdapterRegistrygetInterceptors方法中,需要将AOP配置的通知封装为通知适配器,下面我们继续分析通知适配器的主要源码和功能。

4.通知适配器:

通知适配器AdvisorAdapter对通知进行封装,为通知提供Spring
AOP
的增强功能,下面我们以MethodBeforeAdviceAdapter为例,分析通知适配器的具体功能:

(1).MethodBeforeAdviceAdapter源码:

通过对MethodBeforeAdviceAdapter的源码分析,我们看到通知适配器在获取到通知器的通知后,将通知封装为方法拦截器,我们接下来分析MethodBeforeAdviceInterceptor是如何将通知封装为方法拦截器的。

(2).MethodBeforeAdviceInterceptor封装通知:

MethodBeforeAdviceInterceptor封装通知实现了Spring
AOP
的织入功能,其源码如下:

通过对MethodBeforeAdviceInterceptor拦截器的源码分析,我们看到,SpringAOP处理的基本流程:

首先,为目标对象对象创建AOP代理对象,根据AOP配置获取通知器,通知器中持有切入点和通知。

其次,根据通知器中的切入点,获取目标类目标方法的通知,并将通知封装为拦截器,添加到代理拦截链中。

最后,调用目标对象目标方法时,调用AOP代理对象,根据通知在调用目标对象方法时触发调用通知链中通知拦截器的回调方法。

5.方法拦截器:

4中我们已经分析了MethodBeforeAdviceInterceptor源码,了解到方法拦截器主要作用是根据通知类型在调用目标方法时触发通知的回调,我们接下来分析AfterReturningAdviceInterceptorThrowsAdviceInterceptor拦截器的源码,了解对后置通知和异常通知的处理实现:

(1).AfterReturningAdviceInterceptor:

(2).ThrowsAdviceInterceptor

异常通知拦截器ThrowsAdviceInterceptor和前置通知拦截器MethodBeforeAdviceInterceptor、后置通知拦截器AfterReturningAdviceInterceptor类似,不同之处在于需要维护异常处理器,因此更加复杂,源码如下:

6.ProxyFactory实现编程式AOP:

在上一篇博客《创建AOP代理对象并对目标对象切面拦截》中,我们以ProxyFactoryBean
为例,分析了Spring创建AOP代理对象以及对目标对象进行切面拦截的实现过程,在Spring中还有另一个创建AOP代理对象的容器——ProxyFactory,两个创建AOP代理对象容器的区别如下:

a.ProxyFactory:创建编程式的Spring
AOP
应用。

b.ProxyFactoryBean:创建声明式的Spring
AOP
应用。

我们现在通过分析ProxyFactory源码,了解Spring编程式AOP应用的具体实现:

(1).使用ProxyFactory编程式AOP应用的简单例子:

(2).ProxyFactory源码:

通过上述对ProxyFactory源码的分析可以看出,获取代理对象的getProxy()方法中,调用ProxyCreatorSupportcreateAopProxy()方法获得DefaultAopProxyFactory对象,通过调用DefaultAopProxyFactory类的createAopProxy方法来调用JDK或者CGLIB创建AOP代理对象,与ProxyFactoryBean实现原理相同,通知的配置以及方法的通知链拦截调用等都与ProxyFactoryBean完全相同,这里不再赘述,请实现参考上一篇博客对ProxyFactoryBean的分析。

抱歉!评论已关闭.