《Spring Recipes》第三章筆記3:Specifying Aspect Preced...

《Spring Recipes》第三章筆記3:Specifying Aspect Precedence


問題

當在不一樣的切面中對同一個切入點上聲明相同的通知時,就會發生通知優先級的問題。

解決方案

Spring容器提供了使用Ordered接口和@Order註解,兩種指定通知優先級的方式。


使用Ordered接口

切面必須實現Ordered接口,實現getOrder方法,此方法返回的值越小,表面此切面中的通知的優先級越高。
@Aspect 
public class CalculatorValidationAspect implements Ordered {
  @Before("execution(* *.*(double, double))")
  public void validateBefore(JoinPoint joinPoint) {
  ... ...
  }
 public int getOrder() {
   return 0;
 }
}

@Aspect 
public class CalculatorLoggingAspect implements Ordered {
... ..
  public int getOrder() {
    return 1;
 }
}


使用@Order註解

@Aspect 
@Order(0)
public class CalculatorValidationAspect {
...
}

@Aspect 
@Order(1)
public class CalculatorLoggingAspect {
...
}

若是不指定優先級,或者優先級被指定爲相同,通知執行的優先級都是不定的。
經測試,和配置文件中配置的順序一致,沒看源代碼,不肯定老是這樣。
相關文章
相關標籤/搜索