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

转载于:https://www.cnblogs.com/yaojf/p/9877994.html

关于spring aop Advisor排序问题相关推荐

  1. 跟着小马哥学系列之 Spring AOP(Advisor 详解)

    学好路更宽,钱多少加班. --小马哥 简介 大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间< ...

  2. Spring Aop之Advisor解析

    2019独角兽企业重金招聘Python工程师标准>>> 在上文Spring Aop之Target Source详解中,我们讲解了Spring是如何通过封装Target Source来 ...

  3. 【spring aop】连接点(Jointpoint)、切入点(Pointcut)、增强(Advice)、方面/切面(Aspect、Advisor)

    文章目录 前言 1. 先来回顾一下AOP中的一些术语 2. 增强方式简介 2.1 MethodBeforeAdvice前置增强 2.2 AfterReturningAdvice后置增强 2.3 Thr ...

  4. spring Aop中aop:advisor 与 aop:aspect的区别

    在spring的配置中,会用到这两个标签.那么他们的区别是什么呢? <bean id="testAdvice" class="com.myspring.app.ao ...

  5. spring AOP中 aop:advisor 与 aop:aspect 的区别

    在开发过程中,不少有Spring Aop的使用, 在面向切面编程时,我们会使用< aop:aspect>: 在进行事务管理时,我们会使用< aop:advisor>. 那么,对 ...

  6. 【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】

    每篇一句 基础技术总是枯燥但有价值的.数学.算法.网络.存储等基础技术吃得越透,越容易服务上层的各种衍生技术或产品 相关阅读 [小家Spring]Spring AOP原理使用的基础类打点(AopInf ...

  7. Spring AOP 的 Advice 和 Advisor 有什么区别

    简单来说:Advice 是通知,Advisor 是增强器.(说了跟没说一样-) 使用 spring aop 要定义切面,切面里面有 通知 和 切点. 在项目启动的过程中,项目中的所有切面会被 Anno ...

  8. Spring AOP中Pointcut,dvice 和 Advisor三个概念

    Spring  AOP中Pointcut,dvice 和 Advisor三个概念介绍 在理解了Spring的AOP后,需要重点理解的三个概念是:Pointcut    Advice   Advisor ...

  9. 聊聊spring aop中的advisor组件

    1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...

最新文章

  1. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...
  2. HBase参数配置及说明
  3. Python Module_openpyxl_处理Excel表格
  4. springboot入门_打包部署
  5. rdbms mysql_RDBMS-mysql初步
  6. Time to First Byte(TTFB)与Web性能优化
  7. openquery基本运用实例
  8. C++:04---内联函数
  9. java sessionid放入cookie_JAVA开发 SESSION和COOKIE的关系
  10. python列表的加法_Python列表加法理解
  11. 注解描述(持续更新)
  12. Ubuntu14.04快速搭建SVN服务器及日常使用
  13. python基础知识 ~ 异常处理与导入
  14. 苹果的哪个软件能测试游戏帧率,王者荣耀90帧率差别不太大,苹果手机竟然可以体验90帧率...
  15. ​【安全篇 / Web过滤】(5.6) ❀ 01. DNS 过滤僵尸网络 ❀ FortiGate 防火墙
  16. Windows XP/2000/Vista/7/8/8.1/10系统 hosts文件位置及使用
  17. matlab非线性拟合算检验,matlab非线性拟合求参数怎样确定初始值
  18. 打印小册子中断了怎么办
  19. 苹果和android充电线一根,苹果iPhone8充电接口大变:以后和安卓机用同一根数据线!...
  20. Vue前端组件库介绍

热门文章

  1. 一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案
  2. 以安装PyTorch为例说明Anaconda在Windows/Linux上的使用
  3. vigra1.8.0的使用
  4. 【Qt】Qt再学习(八):Media Player(Qt实现多媒体播放器)
  5. 【转载】linux静态链接库与动态链接库的区别及动态库的创建
  6. 在c语言中,函数中的自动变量可以赋初值,每调用一次,赋一次初值,计算机二级考试 程序设计基础试题及答案三...
  7. 3650服务器性能,全新联想System x3650 M4服务器性能出色
  8. java ee 修改_java ee 在数据库中执行增删改查
  9. java servlet 多线程_Servlet的多线程和线程安全
  10. Redux 入门教程(二):中间件与异步操作