《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 {
...
}

如果不指定优先级,或者优先级被指定为相同,通知执行的优先级都是不定的。
经测试,和配置文件中配置的顺序一致,没看源代码,不确定总是这样。


你可能感兴趣的:(spring)