sping AOP三 获取代理对象的advice和advisor

1.AnnotationAwareAspectJAutoProxyCreator作为一个BeanPostProcessor,在postProcessAfterInitialization()中时执行了AbstractAutoProxyCreator.wrapIfNecessary();

2.在执行wrapIfNecessary的时候,创建代理对象之前,首先要通过getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null)方法获取specificInterceptors,即advice和advisor

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    if (beanName != null && this.targetSourcedBeans.contains(beanName)) {
        return bean;
    }
    if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
        return bean;
    }
    if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }

    // Create proxy if we have advice.
    Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    if (specificInterceptors != DO_NOT_PROXY) {
        this.advisedBeans.put(cacheKey, Boolean.TRUE);
        Object proxy = createProxy(
                bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
        this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }

    this.advisedBeans.put(cacheKey, Boolean.FALSE);
    return bean;
}


1.下面主要就是看下getAdvicesAndAdvisorsForBean这个方法了

protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) {
    List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
    if (advisors.isEmpty()) {
        return DO_NOT_PROXY;
    }
    return advisors.toArray();
}

2.没什么好说的,那接着看下findEligibleAdvisors(beanClass, beanName);这个方法吧

protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {  
    //2.1
    List<Advisor> candidateAdvisors = findCandidateAdvisors();

    //3.1
    List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
    
    //4.1
    extendAdvisors(eligibleAdvisors);
    if (!eligibleAdvisors.isEmpty()) {
        eligibleAdvisors = sortAdvisors(eligibleAdvisors);
    }
    return eligibleAdvisors;
}

2.1下面看下findCandidateAdvisors();

protected List<Advisor> findCandidateAdvisors() {
    // Add all the Spring advisors found according to superclass rules.
    //这里返回的是一个空数组,就不再看这个方法了
    List<Advisor> advisors = super.findCandidateAdvisors();
    // Build Advisors for all AspectJ aspects in the bean factory.
    //下面还是要着重看下这个方法
    advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
    return advisors;
}

2.2 buildAspectJAdvisors() 。从advisorsCache中获取对应的Advisor

public List<Advisor> buildAspectJAdvisors() {
    /**
     * 这里省略一些代码(没执行)
     */
    List<Advisor> advisors = new LinkedList<Advisor>(); 
    //aspectNames=["logAspect"]
    for (String aspectName : aspectNames) {
	//在这里获取Advisor advisorsCache是一个Map,执行到这里的时候已经是有值了的
	//private final Map<String, List<Advisor>> advisorsCache = new ConcurrentHashMap<String, List<Advisor>>();
        List<Advisor> cachedAdvisors = this.advisorsCache.get(aspectName);
        if (cachedAdvisors != null) {
            advisors.addAll(cachedAdvisors);
        }
        else {
            MetadataAwareAspectInstanceFactory factory = this.aspectFactoryCache.get(aspectName);
            advisors.addAll(this.advisorFactory.getAdvisors(factory));
        }
    }
    return advisors;
}

3.1 执行过findCandidateAdvisors();之后,接着执行findAdvisorsThatCanApply()。这个方法是循环获取到advisor,然后只留下能够匹配当前类的advisor。

 

4.1 findAdvisorsThatCanApply()。执行过后执行extendAdvisors(eligibleAdvisors);这个方法就是判断advisors是否包含AspectJ advice,如果有,就在数组中开头位置添加一个ExposeInvocationInterceptor.ADVISOR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值