关于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的顺序做排序,先获取先执行

最新文章

  1. Entity Framework 数据库先行、模型先行、代码先行
  2. Python学习之day2
  3. input中空格后的数据不显示
  4. 点击每个li节点,都弹出其文本值及修改
  5. Liferay7 BPM门户开发之43: Gradle依赖管理
  6. VI经典插件ctags
  7. Linux开机自动挂载存储
  8. Java读写大文本文件(2GB以上)
  9. dmp文件导入
  10. zoj 3657 策略题 easy
  11. [转载]iOS开发:获取设备信息
  12. bzoj 2588 Count on a tree
  13. DFS中的奇偶剪枝学习笔记
  14. 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]
  15. ASP.NET Core之NLog使用
  16. mysql密码的坑
  17. PHP查看内存使用
  18. IETester是一个免费的Web浏览器调试工具
  19. Linux 4.18内核系列已过时
  20. centos sendmail 启动慢

热门文章

  1. Python中eval函数的作用
  2. Alibaba Java开发手册索引规约学习笔记
  3. 分布式协调服务Zookeeper扫盲篇
  4. Springboot集成ECharts
  5. C/C++面试题:编写类String的构造函数、析构函数和赋值函数。
  6. DirectX11--实现一个3D魔方(1)
  7. Win10+Ubuntu18.04双系统安装
  8. element ui change 传递带自定义参数
  9. django --视图装饰器
  10. HTTP高并发调优小记