灵魂画手:图解Spring AOP实现原理

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

点击关注公众号,利用碎片时间学习

本篇旨在让读者对Spring AOP实现原理有一个宏观上的认识,因此会丢失一些细节,阅读本篇文章前,希望读者对Spring Ioc以及Spring AOP的使用(@Aspect)由一定了解,话不多说,直接上图

准备工作

  • Service类: 有find方法跟save方法,find方法前后需要缓存操作,save方法前后需要事务操作
  • CacheableAspect切面类: 用于在Service的find方法前后进行缓存操作
  • TransctionlAspect切面类: 用于在Service的save方法进行事务操作
  • LogAspect切面类: 记录所有Controller的请求日志
灵魂画手:图解Spring AOP实现原理

Spring AOP自动代理时机

在service bean的创建过程中(也就是getBean("service")),AOP通过BeanPostProcess后置处理器操作进行介入 分为2种情况:

  • 用户自定义了targetSource,则bean的创建(实例化、填充、初始化)均由用户负责,Spring Ioc不会在管该代理目标对象traget,这种情况基本上不会发生,很多人用了几年Spring可能都不知道有它的存在
  • 正常情况下都是Spring Ioc完成代理对象target的实例化、填充、初始化。然后在初始化后置处理器中进行介入,对bean也就是service进行代理
灵魂画手:图解Spring AOP实现原理

创建代理操作wrapIfNecessary

所有的重点都在wrapIfNecessary做了什么操作

灵魂画手:图解Spring AOP实现原理

代理的方法调用

创建完代理,代理如果调用方法呢?我们以Jdk动态代理为例子,方法的调用将会触发invoke方法。

灵魂画手:图解Spring AOP实现原理

Spring AOP拦截器的执行顺序

从上面可以看出,Spring AOP的代理invoke方法,其实是拦截器的执行。

我们先了解一下Spring AOP的执行顺序,跟栈很像,后进先出

灵魂画手:图解Spring AOP实现原理

AOP拦截器执行原理

那么这个拦截器链又如何保证before在after之前呢?而且还能保证find方法的执行顺序?

这部分实现原理通过几句话是解释不完的,只能给出图大家了解个大概

灵魂画手:图解Spring AOP实现原理

具体拦截器源码:

public class MethodBeforeAdviceInterceptor implements MethodInterceptorBeforeAdviceSerializable {

 private final MethodBeforeAdvice advice;

 @Override
 public Object invoke(MethodInvocation mi) throws Throwable {
  // 先调用before方法
  this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
  // 继续链式调用
  return mi.proceed();
 }

}
public class AfterReturningAdviceInterceptor implements MethodInterceptorAfterAdviceSerializable {

   private final AfterReturningAdvice advice;

   @Override
   public Object invoke(MethodInvocation mi) throws Throwable {
      // 先进行链式调用
      Object retVal = mi.proceed();
      // 再调用afterReturning方法
      this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
      return retVal;
   }

}

压轴题:Spring AOP遇上循环依赖

该部分难度系数十颗星,算是Spring源码最复杂的一块,这块弄懂可以说对Spring的理解已经达到阿里水准了。这里三言两语是不可能解释清楚的,只能贴个图,大家有个宏观上的认知。

灵魂画手:图解Spring AOP实现原理

总结

Spring AOP是Spring重要的组成部分之一,本篇只是给读者宏观上的一个认识,具体还是需要阅读源码。

来源:bugpool.blog.csdn.net/article/details/105352273

推荐:

最全的java面试题库

灵魂画手:图解Spring AOP实现原理
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。“在看”支持我们吧!

原文始发于微信公众号(Java笔记虾):灵魂画手:图解Spring AOP实现原理