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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM