我有一个带有两个注释的方法
@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 { ... }
但这些建议的执行顺序是不确定的吗?
答案 0 :(得分:7)
答案 1 :(得分:4)
6.2.4.7。建议订购
当多条建议都想要运行时会发生什么 相同的加入点? Spring AOP遵循相同的优先规则 AspectJ确定建议执行的顺序。最高的 优先建议首先“在路上”(因此给出了两个 在建议之前,优先级最高的那个先运行)。 “关于 出路“从连接点开始,最高优先级建议最后运行 (所以给出两条建议,最高的一条 优先级将运行第二个。)
当在不同方面定义的两条建议都需要时 在相同的连接点运行,除非您另外指定顺序 执行未定义。您可以通过控制执行顺序 指定优先级。这是通过正常的Spring方式完成的 在。中实现org.springframework.core.Ordered接口 方面类或使用Order注释对其进行注释。鉴于两个 方面,从Ordered.getValue()返回较低值的方面 (或注释值)具有更高的优先级。
当在同一方面定义的两条建议都需要运行时 在同一个连接点,排序是未定义的(因为没有 通过反射检索声明顺序的方法 javac编译的类)。考虑将这些建议方法折叠成 每个方面类中每个连接点一个建议方法,或重构 建议分为不同的方面类 - 可以订购 在方面层面。
http://static.springsource.org/spring/docs/2.0.x/reference/aop.html
答案 2 :(得分:1)
除非明确指出(例如,使用@Order
)
答案 3 :(得分:0)
在进入连接点的路上,具有最低Order值的建议 先被执行。
在离开连接点的路上,建议 最高订单价值首先被执行。
答案 4 :(得分:0)
这是怎么做:
当在相同方面定义的两条建议都需要在同一连接点上运行时,其顺序是未定义的(因为无法通过反射来获取javac编译类的声明顺序)。考虑将这些建议方法折叠成每个方面类中每个连接点的一个建议方法,或将建议重构为单独的方面类-可以在方面级别进行排序。