乐趣区

关于spring:灵魂画手图解Spring-AOP实现原理

本篇旨在让读者对 Spring AOP 实现原理有一个宏观上的意识,因而会失落一些细节,浏览本篇文章前,心愿读者对 Spring Ioc 以及 Spring AOP 的应用 (@Aspect) 由肯定理解,话不多说,间接上图

筹备工作

  • Service 类:  有 find 办法跟 save 办法,find 办法前后须要缓存操作,save 办法前后须要事务操作
  • CacheableAspect 切面类:  用于在 Service 的 find 办法前后进行缓存操作
  • TransctionlAspect 切面类:  用于在 Service 的 save 办法进行事务操作
  • LogAspect 切面类:  记录所有 Controller 的申请日志

Spring AOP 主动代理机会

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

  • 用户自定义了 targetSource,则 bean 的创立(实例化、填充、初始化) 均由用户负责,Spring Ioc 不会在管该代理指标对象 traget,这种状况基本上不会产生,很多人用了几年 Spring 可能都不晓得有它的存在
  • 失常状况下都是 Spring Ioc 实现代理对象 target 的实例化、填充、初始化。而后在初始化后置处理器中进行染指,对 bean 也就是 service 进行代理

创立代理操作 wrapIfNecessary

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

代理的办法调用

创立完代理,代理如果调用办法呢?咱们以 Jdk 动静代理为例子,办法的调用将会触发 invoke 办法。

Spring AOP 拦截器的执行程序

从下面能够看出,Spring AOP 的代理 invoke 办法,其实是拦截器的执行。

咱们先理解一下 Spring AOP 的执行程序,跟栈很像,后进先出

AOP 拦截器执行原理

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

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

具体拦截器源码:

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {

 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 MethodInterceptor, AfterAdvice, Serializable {

   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 重要的组成部分之一,本篇只是给读者宏观上的一个意识,具体还是须要浏览源码。

退出移动版