zoukankan      html  css  js  c++  java
  • Spring AOP 拦截

    在Spring 的AOP中,如果一个Proxy同时实现MethodBeforeAdvice、AfterReturningAdvice和MethodInterceptor接口,那么这三个Advice的执行顺序是什么样的呢?
    经过试验,是和xml文件中的定义顺序有关的。
    如果Proxy的接口实现定义为
         

             
                MethodBeforeAdvice
                AfterReturningAdvice
                MethodInterceptor

             
         
    那么执行的结果是
    MethodBeforeAdvice

    MethodInterceptor: before call

    Really method excuting

    MethodInterceptor: after call

    AfterReturningAdvice

    也就是说,执行顺序是:MethodBeforeAdvice,MethodInterceptor的调用前的部分,目标方法,MethodInterceptor的调用后的部分,AfterReturningAdvice。

    如果proxy的定义是
         
             
                MethodBeforeAdvice
                MethodInterceptor
                AfterReturningAdvice

             
         
    执行的结果是
    MethodBeforeAdvice

    MethodInterceptor: before call

    Really method excuting

    AfterReturningAdvice

    MethodInterceptor: after call
    也就是说,执行的顺序是:MethodBeforeAdvice,MethodInterceptor的调用前的部分,目标方法,AfterReturningAdvice,MethodInterceptor的调用后的部分。

    如果proxy的定义是

         
             
                MethodInterceptor
                MethodBeforeAdvice
                AfterReturningAdvice
             
         
    执行的结果是:
    MethodInterceptor: before call

    MethodBeforeAdvice

    Really method excuting

    AfterReturningAdvice

    MethodInterceptor: after call
    也就是说,执行的顺序是:MethodInterceptor的调用前的部分,MethodBeforeAdvice,目标方法,AfterReturningAdvice,MethodInterceptor的调用后的部分。
    以上的顺序是在springframework 1.2.5中测试的。

    ================================================================

    本人总结:

    MethodBeforeAdvice

    AfterReturningAdvice

    MethodInterceptor

    目标方法之前的拦截的优先级表现:优先级越高,越先拦截

    目标方法之后的拦截的优先级表现:优先级越高,越后拦截

    在xml文件中,ProxyFactoryBean.interceptorNames配置顺序决定advice的执行顺序

     

     

    又:

     

    如 果有多个通知想要在同一连接点运行会发生什么?Spring AOP遵循跟AspectJ一样的优先规则来确定通知执行的顺序。 在“进入”连接点的情况下,最高优先级的通知会先执行(所以给定的两个前置通知中,优先级高的那个会先执行)。 在“退出”连接点的情况下,最高优先级的通知会最后执行。(所以给定的两个后置通知中, 优先级高的那个会第二个执行)。

    当定义在不同 的切面里的两个通知都需要在一个相同的连接点中运行, 那么除非你指定,否则执行的顺序是未知的。你可以通过指定优先级来控制执行顺序。 在标准的Spring方法中可以在切面类中实现org.springframework.core.Ordered 接口或者用Order注解做到这一点。在两个切面中, Ordered.getValue()方法返回值(或者注解值)较低的那个有更高的优先级。

    当 定义在相同的切面里的两个通知都需要在一个相同的连接点中运行, 执行的顺序是未知的(因为这里没有方法通过反射javac编译的类来获取声明顺序)。 考虑在每个切面类中按连接点压缩这些通知方法到一个通知方法,或者重构通知的片段到各自的切面类中 - 它能在切面级别进行排序。

    参考:《spring 揭秘》

    http://book.csdn.net/bookfiles/1140/100114034127.shtml
  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/wblade/p/1984659.html
Copyright © 2011-2022 走看看