Spring注解驱动之AOP原理总结

概述

AOP原理总结

我们需要对AOP原理做一个简单的总结,完美结束对其研究的旅程。

  1. 利用@EnableAspectJAutoProxy注解来开启AOP功能。
  2. 通过@EnableAspectJAutoProxy注解向IOC容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件来开启AOP功能。
  3. AnnotationAwareAspectJAutoProxyCreator组件是一个后置处理器。
  4. 该后置处理器是怎么工作的呢?在IOC容器创建的过程中,我们就能清楚地看到这个后置处理器是如何创建以及注册的,以及它的工作流程。
    • 首先,在创建IOC容器的过程中,会调用refresh()方法来刷新容器,而在刷新容器的过程中有一步是来注册后置处理器的,如下所示:
registerBeanPostProcessors(beanFactory); // 注册后置处理器,在这一步会创建AnnotationAwareAspectJAutoProxyCreator对象

其实,这一步会为所有后置处理器都创建对象。

  • 刷新容器的过程中还有一步是来完成BeanFactory的初始化工作的,如下所示:
finishBeanFactoryInitialization(beanFactory); // 完成BeanFactory的初始化工作。所谓的完成BeanFactory的初始化工作,其实就是来创建剩下的单实例bean的。

很显然,剩下的单实例bean自然就包括MathCalculator(业务逻辑类)和LogAspects(切面类)这两个bean,因此这两个bean就是在这儿被创建的。

  • 创建业务逻辑组件和切面组件
  • 在这两个组件创建的过程中,最核心的一点就是AnnotationAwareAspectJAutoProxyCreator(后置处理器)会来拦截这俩组件的创建过程
  • 怎么拦截呢?主要就是在组件创建完成之后,判断组件是否需要增强。如需要,则会把切面里面的通知方法包装成增强器,然后再为业务逻辑组件创建一个代理对象。我们也认真仔细探究过了,在为业务逻辑组件创建代理对象的时候,使用的是cglib来创建动态代理的。当然了,如果业务逻辑类有实现接口,那么就使用jdk来创建动态代理。一旦这个代理对象创建出来了,那么它里面就会有所有的增强器。
    这个代理对象创建完以后,IOC容器也就创建完了。接下来,便要来执行目标方法了。
  1. 执行目标方法
    • 此时,其实是代理对象来执行目标方法
    • 使用CglibAopProxy类的intercept()方法来拦截目标方法的执行,拦截的过程如下:
      1. 得到目标方法的拦截器链,所谓的拦截器链其实就是每一个通知方法又被包装为了方法拦截器,即MethodInterceptor
      2. 利用拦截器的链式机制,依次进入每一个拦截器中进行执行
      3. 最终,整个的执行效果就会有两套:
        • 目标方法正常执行:前置通知→目标方法→后置通知→返回通知
        • 目标方法出现异常:前置通知→目标方法→后置通知→异常通知

参考

Spring注解驱动开发第33讲——AOP原理总结
Spring注解驱动开发第31讲——目标方法的拦截逻辑
Spring注解驱动开发第32讲——拦截器链的执行过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

融极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值