1. 程式人生 > >Spring AOP切面優先順序(XML和註解)

Spring AOP切面優先順序(XML和註解)

【Spring4.0筆記整理十四】AOP切面優先順序(XML和註解) - CSDN部落格
https://blog.csdn.net/sun8112133/article/details/80551886

 

  我們常常會遇到這樣一個問題, 如果有兩個或多個切面同時對應同一個目標物件時,那麼它的優先順序是怎樣的呢?
  本篇就對切面優先順序進行 XML 和 註解 的設定。
 

本篇可以分為兩部分:

  一、基於XML設定切面優先順序

  二、基於註解設定切面優先順序

  不管是基於哪種方式,設定優先順序的數值越小,優先順序越高(負數也可以)。設定了優先順序數值的切面要比沒有設定優先順序數值的切面的優先順序高,如果兩個切面都沒有設定優先順序數值或優先順序數值相同時,他們的優先順序是不確定的。



 


一、基於XML設定切面優先順序

  如果是基於XMl配置,切面的優先順序可以通過實現 Ordered介面 或利用 XML 中 order屬性 指定。

1、實現Ordered介面

public class Time implements Ordered {
    public void beforeTime() {
        System.out.println("計時開始~~~~~ 我是前置通知,會在目標方法前執行");
    }
    @Override
    public int getOrder() {
        return -2;
    }   
}

 

 

2、在XMl中設定order屬性

<!-- 配置切面類 -->
<aop:config>
    <!-- 配置切面 -->
    <aop:aspect ref="time" order="1">
        <aop:before method="beforeTime" pointcut="execution(public int com.demo.HelloWorld.hello())" />
    </aop:aspect>
    <aop:aspect ref="logger" order="2">
        <aop:before method="beforeLogger" pointcut="execution(public int com.demo.HelloWorld.hello())" />
    </aop:aspect>
</aop:config>

 

 

二、基於註解設定切面優先順序

  如果是基於註解配置,切面的優先順序可以通過實現 Ordered介面 或利用 Order註解 指定。

1、實現Ordered介面

public class Time implements Ordered {
    public void beforeTime() {
        System.out.println("計時開始~~~~~ 我是前置通知,會在目標方法前執行");
    }
    @Override
    public int getOrder() {
        return -2;
    }   
}

 

2、Order 註解指定

@Order(2)
@Aspect
@Component
public class Time {
    public void beforeTime() {
        System.out.println("計時開始~~~~~ 我是前置通知,會在目標方法前執行");
    }   
}