鍍金池/ 問(wèn)答/人工智能  Java  Linux  數(shù)據(jù)庫(kù)/ Spring源碼深度分析問(wèn)題:Aop實(shí)現(xiàn)分別是JdkDynamicAopProx

Spring源碼深度分析問(wèn)題:Aop實(shí)現(xiàn)分別是JdkDynamicAopProxy和 CglibAopProxy

在invoke方法中有如下代碼:

// Get the interception chain for this method.
            List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

上面代碼也就是獲取攔截器鏈,我的理解是這樣

上面這個(gè)方法最終調(diào)用了如下實(shí)現(xiàn)

@SuppressWarnings("serial")
public class DefaultAdvisorChainFactory implements AdvisorChainFactory, Serializable {

    @Override
    public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
            Advised config, Method method, Class<?> targetClass) {

        // This is somewhat tricky... We have to process introductions first,
        // but we need to preserve order in the ultimate list.
        List<Object> interceptorList = new ArrayList<Object>(config.getAdvisors().length);
        Class<?> actualClass = (targetClass != null ? targetClass : method.getDeclaringClass());
        boolean hasIntroductions = hasMatchingIntroductions(config, actualClass);
        AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();

        for (Advisor advisor : config.getAdvisors()) {
            if (advisor instanceof PointcutAdvisor) {
                // Add it conditionally.
                PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
                if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(actualClass)) {
                    MethodInterceptor[] interceptors = registry.getInterceptors(advisor);
                    MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
                    if (MethodMatchers.matches(mm, method, actualClass, hasIntroductions)) {
                        if (mm.isRuntime()) {
                            // Creating a new object instance in the getInterceptors() method
                            // isn't a problem as we normally cache created chains.
                            for (MethodInterceptor interceptor : interceptors) {
                                interceptorList.add(new InterceptorAndDynamicMethodMatcher(interceptor, mm));
                            }
                        }
                        else {
                            interceptorList.addAll(Arrays.asList(interceptors));
                        }
                    }
                }
            }
            else if (advisor instanceof IntroductionAdvisor) {
                IntroductionAdvisor ia = (IntroductionAdvisor) advisor;
                if (config.isPreFiltered() || ia.getClassFilter().matches(actualClass)) {
                    Interceptor[] interceptors = registry.getInterceptors(advisor);
                    interceptorList.addAll(Arrays.asList(interceptors));
                }
            }
            else {
                Interceptor[] interceptors = registry.getInterceptors(advisor);
                interceptorList.addAll(Arrays.asList(interceptors));
            }
        }

        return interceptorList;
    }

}

我的問(wèn)題: 在DefaultAdvisorChainFactory 的getInterceptorsAndDynamicInterceptionAdvice方法中 for循環(huán)內(nèi) 分了三種情況
if (advisor instanceof PointcutAdvisor)

else if (advisor instanceof IntroductionAdvisor) 以及

else {

            Interceptor[] interceptors = registry.getInterceptors(advisor);
            interceptorList.addAll(Arrays.asList(interceptors));
        }
        
        
        我不理解這樣區(qū)分的邏輯是什么,為什么要這樣區(qū)分處理,有朋友可以 解釋一下嗎,非常感謝### 問(wèn)題描述

問(wèn)題出現(xiàn)的環(huán)境背景及自己嘗試過(guò)哪些方法

相關(guān)代碼

// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

回答
編輯回答
孤島

因?yàn)锳dvisor這個(gè)接口有PointcutAdvisor和IntroductionAdvisor兩個(gè)子接口和一個(gè)靜態(tài)內(nèi)部實(shí)現(xiàn)類(lèi)PrototypePlaceholderAdvisor,所以這樣判斷。

2017年9月17日 19:11