主流程可以簡述為:獲取可以應用到此方法上的通知鏈(Interceptor Chain),如果有,則應用通知,并執行joinpoint; 如果沒有,則直接反射執行joinpoint。而這里的關鍵是通知鏈是如何獲取的以及它又是如何執行的,下面逐一分析下。
首先,從上面的代碼可以看到,通知鏈是通過Advised.getInterceptorsAndDynamicInterceptionAdvice()這個方法來獲取的,我們來看下這個方法的實現:
public?ListgetInterceptorsAndDynamicInterceptionAdvice(Method?method,?Class?targetClass)?{??
MethodCacheKeycacheKey?=?new?MethodCacheKey(method);??
Listcached?=?this.methodCache.get(cacheKey);??
if(cached?==?null)?{??
cached=?this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(??
this,method,?targetClass);??
this.methodCache.put(cacheKey,cached);??
}??
returncached;??
} ?
可以看到實際的獲取工作其實是由AdvisorChainFactory. getInterceptorsAndDynamicInterceptionAdvice()這個方法來完成的,獲取到的結果會被緩存。
下面來分析下這個方法的實現:
/**?
*?從提供的配置實例config中獲取advisor列表,遍歷處理這些advisor.如果是IntroductionAdvisor,?
*?則判斷此Advisor能否應用到目標類targetClass上.如果是PointcutAdvisor,則判斷?
*?此Advisor能否應用到目標方法method上.將滿足條件的Advisor通過AdvisorAdaptor轉化成Interceptor列表返回.?
評論
查看更多