【问题标题】:How to inject necessary objects into AspectJ aspects using Guice如何使用 Guice 将必要的对象注入 AspectJ 方面
【发布时间】:2017-07-01 08:21:41
【问题描述】:

在我有一个方面必须在其逻辑中使用一些复杂的实例化服务的情况下,有没有办法使用 Guice 和 AspectJ?

例如:

@Aspect
public class SomeAspect {

  private final ComplexServiceMangedByGuice complexServiceMangedByGuice;

  @Inject
  public SomeAspect(ComplexServiceMangedByGuice complexServiceMangedByGuice){
    this.complexServiceMangedByGuice = complexServiceMangedByGuice;
  }

  @AfterThrowing(value = "execution(* *(..))", throwing = "e")
  public void afterThrowingException(JoinPoint joinPoint, Throwable e){
    complexServiceMangedByGuice.doSomething(e);
  }
}

如果我尝试在示例中使用它(使用方面构造函数),我的方面将不会被调用。如果我尝试注入字段(未定义方面构造函数),将调用方面但不会设置字段complexServiceMangedByGuice。 我发现的一个解决方案是在通知方法主体中获取实例,因此方面看起来像这样:

@Aspect
public class SomeAspect {

private static ComplexServiceManagedByGuice complexServiceManagedByGuice;

  @AfterThrowing(value = "execution(* *(..))", throwing = "e")
  public void afterThrowingException(JoinPoint joinPoint, Throwable e){
    if(complexServiceManagedByGuice == null){
    Injector injector = Guice.createInjector(new ModuleWithComplexService());
    complexServiceMangedByGuice = injector.getInstance(ComlexServiceManagedByGuice.class);
    }
    complexServiceMangedByGuice.doSomething(e);
  }
}

但这有一些不合需要的开销。

【问题讨论】:

  • @OlivierGrégoire 是的,我在问题中写了它。:) 如果我尝试注入字段(未定义方面构造函数),将调用方面但不会设置字段 complexServiceMangedByGuice。

标签: java dependency-injection aop guice aspectj


【解决方案1】:

您可以像这样注释方面类的字段:

@Inject
SomeDependency someDependency

然后通过在 Guice 模块的 configure() 方法中编写以下代码,让 Guice 将依赖项注入到你的切面类中:

requestInjection(Aspects.aspectOf(SomeAspect.class));

requestInjection 的文档说:

创建成功后,Injector 将注入给定对象的实例字段和方法

来源:https://github.com/jponge/guice-aspectj-sample

【讨论】:

    【解决方案2】:

    这是我一直在努力解决的问题,我认为没有一个好的答案。

    这两个库基本上是相互对抗的:AspectJ 方面基本上是静态的,Guice abhors making anything injectable be static

    我认为您的选择是:

    • 使用Guice AOP - 干净,但与 AspectJ 相比有限(只能编织注入的类)
    • 将注入器放入静态“全局”引用中,以便方面可以访问它。 (糟糕。)
    • 使用某种线程上下文(最终是线程本地)将注入器与方面进行通信(也很糟糕 - 虽然可能不那么重要)

    【讨论】:

    • 您能否详细说明“AspectJ 方面本质上是静态的”是什么意思?
    • 虽然这个答案有一些好处,但它们并不可靠,因为 zAlbee 的答案表明存在一种通过 Guice 注入 Aspects 的实用方法。
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多