如何控制spring aop 拦截顺序

悬赏:5 发布时间:2008-08-04 提问人:hyxkangta123 (初级程序员)

spring aop中对同一个joinpoint的两个before advice (a 和 b) ,如何实现先对a后对b进行拦截
      @Before("somePointCut()")
      public void b() {
		//doSomeThing
	}

	@Before("somePointCut()")
	public void a() {
		//checking

	}

以前我试过把a放在前面,b放在后面,但有时候却不是按照这样的顺序

谢谢

采纳的答案

2008-08-04 lggege (架构师)

Spring文档说明:
引用
6.2.4.7. 通知(Advice)顺序
如果有多个通知想要在同一连接点运行会发生什么?Spring AOP 的执行通知的顺序跟AspectJ的一样。... 对于定义在相同切面的通知,根据声明的顺序来确定执行顺序。比如下面这个切面:

@Aspect
public class AspectWithMultipleAdviceDeclarations {

  @Pointcut("execution(* foo(..))")
  public void fooExecution() {}
  
  @Before("fooExecution()")
  public void doBeforeOne() {
    // ...
  }
  
  @Before("fooExecution()")
  public void doBeforeTwo() {
    // ...
  }


引用
换言之,因为doBeforeOne先定义,它会先于doBeforeTwo执行,

提问者对于答案的评价:
之前我试过了,也确实是先定义先执行,可我在项目中用的时候却有时候不是这样,可能是其他因素干扰把

其他回答

在spring里面拦截的时候有拦截的方法的表达式
你可以写拦截的表达式进行拦截
ningbe (初级程序员) 2008-08-04
可以看看Reference中关于通知顺序方面的章节的说明。再没有实现org.springframework.core.Ordered接口的情况下,执行顺序就是定义在切面中的通知的顺序。
lsy (初级程序员) 2008-08-04