概述
AOP原理总结
我们需要对AOP原理做一个简单的总结,完美结束对其研究的旅程。
- 利用@EnableAspectJAutoProxy注解来开启AOP功能。
- 通过@EnableAspectJAutoProxy注解向IOC容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件来开启AOP功能。
- AnnotationAwareAspectJAutoProxyCreator组件是一个后置处理器。
- 该后置处理器是怎么工作的呢?在IOC容器创建的过程中,我们就能清楚地看到这个后置处理器是如何创建以及注册的,以及它的工作流程。
- 首先,在创建IOC容器的过程中,会调用refresh()方法来刷新容器,而在刷新容器的过程中有一步是来注册后置处理器的,如下所示:
registerBeanPostProcessors(beanFactory); // 注册后置处理器,在这一步会创建AnnotationAwareAspectJAutoProxyCreator对象
其实,这一步会为所有后置处理器都创建对象。
- 刷新容器的过程中还有一步是来完成BeanFactory的初始化工作的,如下所示:
finishBeanFactoryInitialization(beanFactory); // 完成BeanFactory的初始化工作。所谓的完成BeanFactory的初始化工作,其实就是来创建剩下的单实例bean的。
很显然,剩下的单实例bean自然就包括MathCalculator(业务逻辑类)和LogAspects(切面类)这两个bean,因此这两个bean就是在这儿被创建的。
- 创建业务逻辑组件和切面组件
- 在这两个组件创建的过程中,最核心的一点就是AnnotationAwareAspectJAutoProxyCreator(后置处理器)会来拦截这俩组件的创建过程
- 怎么拦截呢?主要就是在组件创建完成之后,判断组件是否需要增强。如需要,则会把切面里面的通知方法包装成增强器,然后再为业务逻辑组件创建一个代理对象。我们也认真仔细探究过了,在为业务逻辑组件创建代理对象的时候,使用的是cglib来创建动态代理的。当然了,如果业务逻辑类有实现接口,那么就使用jdk来创建动态代理。一旦这个代理对象创建出来了,那么它里面就会有所有的增强器。
这个代理对象创建完以后,IOC容器也就创建完了。接下来,便要来执行目标方法了。
- 执行目标方法
- 此时,其实是代理对象来执行目标方法
- 使用CglibAopProxy类的intercept()方法来拦截目标方法的执行,拦截的过程如下:
- 得到目标方法的拦截器链,所谓的拦截器链其实就是每一个通知方法又被包装为了方法拦截器,即MethodInterceptor
- 利用拦截器的链式机制,依次进入每一个拦截器中进行执行
- 最终,整个的执行效果就会有两套:
- 目标方法正常执行:前置通知→目标方法→后置通知→返回通知
- 目标方法出现异常:前置通知→目标方法→后置通知→异常通知
参考
Spring注解驱动开发第33讲——AOP原理总结
Spring注解驱动开发第31讲——目标方法的拦截逻辑
Spring注解驱动开发第32讲——拦截器链的执行过程