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();}
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