【问题标题】:Ordering third party Aspect in Spring在 Spring 中订购第三方 Aspect
【发布时间】:2018-03-09 03:21:26
【问题描述】:

我有一个新的方面,我想应用@Around 一个用@HystrixCommand 注释的服务方法。由于注解,HystrixCommandAspect 被自动应用。

但是,HystrixCommandAspect 没有定义@Order,我怀疑这意味着它默认为Integer.MAX_VALUE(即它应该最后执行)。我需要我的切面最后运行,因为HystrixCommandAspect 在不同的线程上执行服务方法,而我的切面需要在该线程上运行(原因在这里可能并不重要,但它涉及线程本地存储)。

似乎当@Order 出现平局时,顺序是由Spring 的组件扫描以某种方式确定的。有没有办法手动指定 Spring 应用这些方面的顺序(鉴于我无法更改 HystrixCommandAspect@Order)?

【问题讨论】:

  • 我做了更多的挖掘工作,我怀疑这与 Spring Boot 的自动配置有关。 Hystrix 定义了它自己的 spring.factories,它引用了 HystrixCircuitBreakerConfiguration,暴露了一个 hystrixCommandAspect bean。我可以用我自己的配置类覆盖该 bean(只有当我也为我的配置使用自动配置时,覆盖似乎才有效),这是 Hystrix 方面的复制和粘贴,带有 @Order 注释。然而,我的第二个方面类似乎从未被添加,无论我是否使用自动配置来添加它。
  • 原来HystrixCommandAspect只是直接调用方法而不是继续JoinPoint。这就是为什么从不调用后面的方面。我提出了Hystrix bug

标签: java spring spring-boot hystrix


【解决方案1】:

您可以尝试使用@DeclarePrecedence,例如:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclarePrecedence;

@Aspect
@DeclarePrecedence("*, com.example.HystrixCommandAspect, com.example.YourCustomAspect")
public class AspectOrder {
}

可能需要您切换到 AspectJ。

【讨论】:

  • Hystrix 似乎正在使用 spring boot 自动配置,所以我不确定这将如何与 AspectJ 一起使用。无论我在aop.xml 中指定什么,自动配置似乎都能发挥作用。
  • 这里不可能解释所有使用aspectj和spring的理论。您最好阅读官方spring core参考手册中的相应章节,并花一些时间阅读他们的代码。简而言之,它对定义方面的 AspectJ 没有任何影响。您只需要定义它们的位置。从 spring 的角度来看,您根本不需要做任何事情(AspectJ 承担所有责任)。但是如果需要将某些方面变成 bean(例如对于 DI),那么您必须通过特殊方法“aspectOf”来实例化它们。
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多