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