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
