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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理