主流程可以簡述為:獲取可以應(yīng)用到此方法上的通知鏈(Interceptor Chain),如果有,則應(yīng)用通知,并執(zhí)行joinpoint; 如果沒有,則直接反射執(zhí)行joinpoint。而這里的關(guān)鍵是通知鏈?zhǔn)侨绾潍@取的以及它又是如何執(zhí)行的,下面逐一分析下。
首先,從上面的代碼可以看到,通知鏈?zhǔn)峭ㄟ^Advised.getInterceptorsAndDynamicInterceptionAdvice()這個(gè)方法來獲取的,我們來看下這個(gè)方法的實(shí)現(xiàn):
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;??
} ?
可以看到實(shí)際的獲取工作其實(shí)是由AdvisorChainFactory. getInterceptorsAndDynamicInterceptionAdvice()這個(gè)方法來完成的,獲取到的結(jié)果會(huì)被緩存。
下面來分析下這個(gè)方法的實(shí)現(xiàn):
/**?
*?從提供的配置實(shí)例config中獲取advisor列表,遍歷處理這些advisor.如果是IntroductionAdvisor,?
*?則判斷此Advisor能否應(yīng)用到目標(biāo)類targetClass上.如果是PointcutAdvisor,則判斷?
*?此Advisor能否應(yīng)用到目標(biāo)方法method上.將滿足條件的Advisor通過AdvisorAdaptor轉(zhuǎn)化成Interceptor列表返回.?
評(píng)論
查看更多