春季注释建议顺序

问题描述 投票:7回答:5

我有一个方法有两个注解

@One
@Two
public Object foo() { ... }

我有两个方面使用了这些注释。

@Around("@annotation(One)")
public Object doOne(final ProceedingJoinPoint joinPoint) throws Throwable { ... }

@Around("@annotation(Two)")
public Object doTwo(final ProceedingJoinPoint joinPoint) throws Throwable { ... }

但是这些建议的执行顺序是不是不确定的呢?

spring spring-aop
5个回答
7
投票

顺序是未定义的。如果你需要确定的顺序,使用 @Order 注释。

另见。


4
投票

6.2.4.7. 订购建议

当多个建议都想在同一个连接点运行时,会发生什么?Spring AOP遵循与AspectJ相同的优先规则来决定建议的执行顺序。优先级最高的建议在 "进来的路上 "先运行(所以给定两个before建议,优先级最高的那个先运行)。从连接点出发的 "途中",优先级最高的建议最后运行(所以给定两段后的建议,优先级最高的那段将次之)。

当两个定义在不同方面的建议都需要在同一个连接点上运行时,除非你另外指定,否则执行顺序是未定义的。您可以通过指定优先级来控制执行顺序。这可以通过在 aspect 类中实现 org.springframework.core.Ordered 接口或用 Order 注解来实现,以正常的 Spring 方式进行。给定两个方面,从Ordered.getValue()返回较低值的方面(或注释值)具有较高的优先级。

当同一方面中定义的两个建议都需要在同一个连接点运行时,排序是未定义的(因为对于javac编译的类来说,没有办法通过反射检索声明顺序)。考虑将这种建议方法折叠成每个方面类中的每个连接点的一个建议方法,或者将这些建议碎片重构成单独的方面类--可以在方面级进行排序。

http:/static.springsource.orgspringdocs2.0.xreferenceaop.html


1
投票

顺序是未定义的,除非明确指出(例如,通过使用 @Order)


1
投票
  1. 在进入连接点的过程中,订单值最低的建议首先被执行。

  2. 在从连接点出来的过程中,Order值最高的建议先被执行。

  3. 当定义在同一个方面的两个建议都需要在同一个连接点运行时,排序是未定义的.考虑将这样的建议方法折叠成每个方面类中的每个连接点的一个建议方法,或者将这些建议重构成单独的方面类--可以在方面级别上进行排序。

0
投票

这就是如何做的。

当两个定义在同一个方面的建议方法都需要在同一个连接点运行时,排序是未定义的(因为对于javac编译的类来说,没有办法通过反射来检索声明顺序)。考虑将这种建议方法折叠成每个方面类中每个连接点的一个建议方法,或者将这些建议碎片重构成单独的方面类--可以在方面级进行排序。

https:/docs.spring.iospringdocs3.0.xspring-framework-referencehtmlaop.html#aop-ataspectj-advice-ordering

© www.soinside.com 2019 - 2024. All rights reserved.