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
  • 相关阅读:
    CefSharp.v49.0.1浏览器控件完全WPF版,实现禁止弹出新窗口,在同一窗口打开链接,并且支持带type="POST" target="_blank"的链接
    C#动态调用WebService
    WPF实现窗体中的悬浮按钮
    Oracle树结构查询按层级排序
    WPF自定义TabControl样式
    WPF自定义Window窗体样式
    C# 实现图片压缩
    C# 图片反色处理 图片夜间模式
    C#中多线程中变量研究
    EasyNetQ操作RabbitMQ(高级消息队列)
  • 原文地址:https://www.cnblogs.com/wblade/p/1984659.html
Copyright © 2011-2022 走看看