Java 如何使用Guice将必要的对象注入AspectJ方面

Java 如何使用Guice将必要的对象注入AspectJ方面,java,dependency-injection,aop,guice,aspectj,Java,Dependency Injection,Aop,Guice,Aspectj,有没有一种方法可以使用Guice和AspectJ来处理这样的情况:我有一个方面,它必须使用一些复杂的东西来实例化其逻辑中的服务 例如: @Aspect public class SomeAspect { private final ComplexServiceMangedByGuice complexServiceMangedByGuice; @Inject public SomeAspect(ComplexServiceMangedByGuice complexServiceM

有没有一种方法可以使用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);
  }
}
如果我尝试像示例中那样(使用方面构造函数),我的方面将不会被调用。如果我尝试注入字段(未定义方面构造函数),将调用方面,但不会设置字段
complexServiceRangedByGuice
。 我发现的一个解决方案是在advice方法体中获取实例,因此一个方面如下所示:

@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);
  }
}

但这会带来一些不必要的开销。

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

这两个库基本上是相互对立的:AspectJ方面基本上是静态的,并且

我认为你的选择是:

  • 使用-干净,但与AspectJ相比受到限制(只能编织注入类)
  • 将喷油器置于静态“全局”参考中,以便方面可以访问它。(恶心。)
  • 使用某种线程上下文(最终是一个线程本地)将注入器与方面进行通信(也很恶心——尽管可能不是这样)

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

      这两个库基本上是相互对立的:AspectJ方面基本上是静态的,并且

      我认为你的选择是:

      • 使用-干净,但与AspectJ相比受到限制(只能编织注入类)
      • 将喷油器置于静态“全局”参考中,以便方面可以访问它。(恶心。)
      • 使用某种线程上下文(最终是一个线程本地)将注入器与方面进行通信(也很恶心——尽管可能不是这样)

      您可以这样注释aspect类的字段:

      @Inject
      SomeDependency someDependency
      
      然后要求Guice将依赖项注入到aspect类中,方法是将其写入Guice模块的
      configure()
      方法:

      requestInjection(Aspects.aspectOf(SomeAspect.class));
      
      requestInjection
      的文档说明:

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


      来源:

      您可以这样注释aspect类的字段:

      @Inject
      SomeDependency someDependency
      
      然后要求Guice将依赖项注入到aspect类中,方法是将其写入Guice模块的
      configure()
      方法:

      requestInjection(Aspects.aspectOf(SomeAspect.class));
      
      requestInjection
      的文档说明:

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


      来源:

      @OlivierGrégoire是的,我在问题中写的。:)如果我尝试注入字段(未定义方面构造函数),将调用方面,但不会设置字段ComplexServiceChangedByGuice。@OlivierGrégoire是的,我在问题中写的。:)如果我尝试注入字段(未定义方面构造函数),将调用aspect,但不会设置field ComplexServiceRangedByGuice。请详细说明“AspectJ aspects本质上是静态的”是什么意思?虽然这个答案提出了一些优点,但它们并不可靠,因为zAlbee的答案表明有一种通过Guice注入aspect的实用方法。请详细说明您的想法“AspectJ方面本质上是静态的”这句话的意思是什么?虽然这个答案有一些优点,但它们并不可靠,因为zAlbee的答案表明有一种通过Guice注入方面的实用方法。