zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    《人月神话》阅读笔记3
    团队冲刺0110
    团队冲刺0109
    团队冲刺0108
    团队冲刺0107
    团队冲刺0106
    团队冲刺0105
    团队冲刺010304
    团队冲刺0102
    团队冲刺0101
  • 原文地址:https://www.cnblogs.com/dengrong/p/10809922.html
Copyright © 2011-2022 走看看