spring5.0版本-AOP-如何实现拦截器链式调用(责任链模式)

CglibAopProxy类第688行:new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();

参数 chain:拦截器链,保含了目标方法的所有切面方法 ,从chain里面的数组元素的顺序来看,拦截器的顺序before不再after前面执行

 每一个  **Interceptor有一个invoke()方法

Interceptor是一个空接口  MethodInterceptor extends Interceptor  ,以下是Interceptor的继承结构:

public interface Advice {

}

public interface Interceptor extends Advice {

}

public interface MethodInterceptor extends Interceptor {
    
    
    Object invoke(MethodInvocation invocation) throws Throwable;

}
Object invoke(MethodInvocation invocation) throws Throwable;方法:
参数 :
MethodInvocation 类中有proceed()方法,以下是MethodInvocation的继承结构:
public interface Joinpoint {

    
    Object proceed() throws Throwable;

    
    Object getThis();

    
    AccessibleObject getStaticPart();

}

public interface Invocation extends Joinpoint {

    
    Object[] getArguments();

}

public interface MethodInvocation extends Invocation {

    Method getMethod();

}
View Code
MethodInvocation extends Invocation extends JoinPoint ,proceed()方法时JoinPoint接口声明的

然后ReflectiveMethodInvocation implements ProxyMethodInvocation ,ProxyMethodInvocation extends MethodInvocation
spring的拦截器 xxxInterceptor都实现了自己的 Object invoke(MethodInvocation invocation)方法

ReflectiveMethodInvocation类中的 proceed()方法会遍历拦截器链,调用每个拦截器的invoke方法,传入ReflectiveMethodInvocation自身作为参数,

每个拦截器的invoke方法做两件事(这两件事的执行顺序因拦截器的功能而异):1.执行自己的业务逻辑 2.执行ReflectiveMethodInvocation的proceed():这样就实现了链式调用

这就是责任链模式:
统一的业务接口:Handler接口 中的方法invoke(),即业务方法
责任链相当于一个负责人集合,每一个负责人都实现了自己的invoke()方法来处理传进来的数据或对象或对象的指定方法
如何通知下一个负责人处理业务:
方法1:设计一个责任链执行器,包含责任链集合。责任链执行器中有一个proceed(),方法内遍历执行负责人的invoke()方法,invoke方法以执行器作为参数:
invoke(执行器),invoke(执行器)处理完业务后,执行器又调用proceed()方法,将索引移到下一个负责人位置。
这样:执行器和负责人的方法相互调用,而执行器通过移动索引通知下一个负责人处理业务。
方法2:基于链表的责任链,每一个负责人是一个责任节点Node,包含指向下一个负责人的next引用
负责人的处理业务的方法 invoke()这时不带参数,invoke()方法里面递归调用invoke()方法,并设置出口条件。
如何通知下一个负责人处理业务:invoke()方法:1.处理业务,2.next.invoke(),3.出口条件可以是next!=null
原文地址:https://www.cnblogs.com/dengrong/p/10809922.html