關於spring aop Advisor排序問題


關於spring aop Advisor排序問題

當我們使用多個Advisor的時候有時候需要排序,這時候可以用注解org.springframework.core.annotation.Order或者實現org.springframework.core.Ordered接口。

示例代碼:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

/**
 * @author yaojiafeng
 * @create 2017-09-11 下午3:32
 */
@Aspect
@Order(1)
public class LogAspect implements Ordered {

    Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Pointcut("@annotation(com.yaojiafeng.test.aop.LogMDC)")
    public void log() {

    }

    @Around("log()")
    public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        String interfaceName = proceedingJoinPoint.getTarget().getClass().getName();
        String methodName = proceedingJoinPoint.getSignature().getName();
        Object[] args = proceedingJoinPoint.getArgs();
        Object obj = null;
        try {
            obj = proceedingJoinPoint.proceed();
        } finally {
            logger.info(interfaceName + "-" + methodName + "-" + obj + "-" + args);
        }
        return obj;
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

spring aop會在AnnotationAwareAspectJAutoProxyCreator處理bean查找到適配的Advisor的時候對所有Advisor進行排序並生成動態代理,AspectJAwareAdvisorAutoProxyCreator的sortAdvisors方法

@Override
	@SuppressWarnings("unchecked")
	protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
		List<PartiallyComparableAdvisorHolder> partiallyComparableAdvisors =
				new ArrayList<PartiallyComparableAdvisorHolder>(advisors.size());
		for (Advisor element : advisors) {
			partiallyComparableAdvisors.add(
					new PartiallyComparableAdvisorHolder(element, DEFAULT_PRECEDENCE_COMPARATOR));
		}
		List<PartiallyComparableAdvisorHolder> sorted =
				PartialOrder.sort(partiallyComparableAdvisors);
		if (sorted != null) {
			List<Advisor> result = new ArrayList<Advisor>(advisors.size());
			for (PartiallyComparableAdvisorHolder pcAdvisor : sorted) {
				result.add(pcAdvisor.getAdvisor());
			}
			return result;
		}
		else {
			return super.sortAdvisors(advisors);
		}
	}

這里會根據每個Advisor的獲取到的order值進行從小到大排序,order值獲取規則如下:

  1. 首先判斷當前Advisor所在的切面類是否實現org.springframework.core.Ordered接口,是的話調用getOrder方法獲取
  2. 否則判斷當前Advisor所在的切面類是否包含org.springframework.core.annotation.Order注解,是的話從注解獲取
  3. 沒有取到值,默認為最低優先級,值為最大Int

從排序代碼可知,有以下處理過程:

  1. 打在Advice方法上的org.springframework.core.annotation.Order注解不予識別
  2. 如果一個切面類存在多個Advisor,則會按Advice方法的聲明順序,聲明在前的優先級高,先執行
  3. 不同切面類但是order值是一樣的,則按spring獲取到切面bean的順序做排序,先獲取先執行


免責聲明!

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



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