【小家Spring】探索Spring AOP中aopalliance的Joinpoint、MethodInvocation、Interceptor、MethodInterceptor...(中)

简介: 【小家Spring】探索Spring AOP中aopalliance的Joinpoint、MethodInvocation、Interceptor、MethodInterceptor...(中)

从这里我们需要注意到的是:ProxyMethodInvocationReflectiveMethodInvocation)是代理执行的入口。然后内部会把所有的 增强器 都拿出来 递归执行(比如前置通知,就在目标方法之前执行) **这就实现了指定次序的链式调用**




image.png


CglibMethodInvocation


它是继承自ReflectiveMethodInvocation,是CglibAopProxy自己使用的执行器。


  private static class CglibMethodInvocation extends ReflectiveMethodInvocation {
    private final MethodProxy methodProxy;
    private final boolean publicMethod;
    public CglibMethodInvocation(Object proxy, @Nullable Object target, Method method,
        Object[] arguments, @Nullable Class<?> targetClass,
        List<Object> interceptorsAndDynamicMethodMatchers, MethodProxy methodProxy) {
      // 调用父类的构造  完成基本参数得初始化
      super(proxy, target, method, arguments, targetClass, interceptorsAndDynamicMethodMatchers);
      // 自己的个性化参数:
      // 这个参数是子类多传的,表示:它是CGLIb拦截的时候的类MethodProxy
      //MethodProxy为生成的代理类对方法的代理引用。cglib生成用来代替Method对象的一个对象,使用MethodProxy比调用JDK自身的Method直接执行方法效率会有提升
      // 它有两个重要的方法:invoke和invokeSuper
      this.methodProxy = methodProxy;
      // 方法是否是public的  对应下面的invoke方法的处理 见下面
      this.publicMethod = Modifier.isPublic(method.getModifiers());
    }
    @Override
    protected Object invokeJoinpoint() throws Throwable {
      // 如果是public的方法,调用methodProxy去执行目标方法
      // 否则直接执行method即可
      if (this.publicMethod) {
        // 此处务必注意的是,传入的是target,而不能是proxy,否则进入死循环
        return this.methodProxy.invoke(this.target, this.arguments);
      } else {
        return super.invokeJoinpoint();
      }
    }
  }

org.aopalliance.intercept.MethodInterceptor


需要说明的cglib包里也存在一个MethodInterceptor,它的主要作用是CGLIB内部使用,一般是和Enhancer一起来使用而创建一个动态代理对象。


而本处我们讲到的 org.aopalliance.intercept.MethodInterceptor,那些@AspectJ定义的通知们(增强器们),或者是自己实现的MethodBeforeAdvice、AfterReturningAdvice…(总是都是org.aopalliance.aop.Advice一个通知器),最终都会被包装成一个org.aopalliance.intercept.MethodInterceptor,最终交给MethodInvocation(其子类ReflectiveMethodInvocation)去执行,它会把你所有的增强器都给执行了,这就是我们面向切面编程的核心思路过程。

image.png


这里面其实有两个标记接口(没有任何方法):

顶层接口:Advice 中文意思:建议,忠告。 实现通知的方式可议是任何方式,比如Interceptors拦截器得方式

中间层接口:Interceptor 继承自Advice接口。它就是以拦截器方式去实现通知的效果


此处需要说明的是,Interceptor得子接口有两个:MethodInterceptor和ConstructorInterceptor,但是ConstructorInterceptor连Spring都没有提供实现类,因此本文不会讲述本接口。


// 从名字里都能看出来,它是通过拦截方法的执行来实现通知得效果的~~~~
@FunctionalInterface
public interface MethodInterceptor extends Interceptor {
  // 可议在此方法里  在方法执行之前、之后做对应的处理。
  // 需要执行的时候,调用invocation.proceed()方法即可
  Object invoke(MethodInvocation invocation) throws Throwable;
}


Spring给我们提供的MethodInterceptor实现非常非常的多:


image.png


有很多我们非常熟悉的面孔。下面就抽出几个,简单的看看实现代码:

关于AspectJ切面相关的增强器

一共5个对应着AspectJ提供的那五个注解。每个注解都是一个最终被包装好的Advice(其实是个AspectJAfterAdvice) 此处知道就可,暂时此处不做详细介绍~~



image.png


MethodBeforeAdviceInterceptor


这个源代码很简单,就是一层代理。把MethodBeforeAdvice包装成了一个MethodInterceptor


public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {
  private MethodBeforeAdvice advice;
  public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
    Assert.notNull(advice, "Advice must not be null");
    this.advice = advice;
  }
  @Override
  public Object invoke(MethodInvocation mi) throws Throwable {
    // 在目标方法执行之前,先执行advice得before方法~~~
    this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
    // 注意此处继续调用了 mi.proceed()。相当于去执行下一个增强器。类似于递归执行了,这样就行程了一个链式得调用执行
    return mi.proceed();
  }
}



相关文章
|
3天前
|
运维 Java 程序员
Spring5深入浅出篇:基于注解实现的AOP
# Spring5 AOP 深入理解:注解实现 本文介绍了基于注解的AOP编程步骤,包括原始对象、额外功能、切点和组装切面。步骤1-3旨在构建切面,与传统AOP相似。示例代码展示了如何使用`@Around`定义切面和执行逻辑。配置中,通过`@Aspect`和`@Around`注解定义切点,并在Spring配置中启用AOP自动代理。 进一步讨论了切点复用,避免重复代码以提高代码维护性。通过`@Pointcut`定义通用切点表达式,然后在多个通知中引用。此外,解释了AOP底层实现的两种动态代理方式:JDK动态代理和Cglib字节码增强,默认使用JDK,可通过配置切换到Cglib
|
3天前
|
XML Java 数据格式
Spring使用AOP 的其他方式
Spring使用AOP 的其他方式
14 2
|
3天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
17 2
|
8天前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
22 5
|
8天前
|
XML Java 数据格式
Spring AOP
【5月更文挑战第1天】Spring AOP
25 5
|
2月前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
52 0
|
3月前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
50 0
|
2月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
135 0
|
1月前
|
存储 JSON Java
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
SpringBoot集成AOP实现每个接口请求参数和返回参数并记录每个接口请求时间
43 2
|
2月前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革