2017-02-13 38 views
0

有没有一种方法可以使用Guice和AspectJ的情况下,我有一个方面必须在其逻辑中使用一些复杂到实例化的服务?如何使用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); 
    } 
} 

如果我试图让它像示例(纵横构造函数),我的方面将不会被调用。如果我尝试注入字段(没有定义的方面构造函数),方面将被调用,但字段​​将不会被设置。 一个解决办法我发现是获得实例在通知方法体,所以一个方面是这样的:

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

但是,有一些不良的开销。

+1

@OlivierGrégoire是的,我写的问题:)如果我尝试注入字段(没有定义的方面构造函数),方面将被调用,但字段complexServiceMangedByGuice不会被设置。 – 4evertoblerone

回答

2

这是我摔跤的事情,我不认为有一个很好的答案。

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

我觉得你的选择是:

  • 使用Guice AOP - 干净,但相比AspectJ的(只能织注入类)有限
  • 把喷油器为静态“全球性”的参考,因此一方面可以访问它。 (呸)
  • 使用某种类型的线程上下文(最终线程局部)的注射器进行沟通方面(也难吃的 - 但也许没有那么)
+1

请您详细说明“AspectJ方面本质上是静态的”是什么意思? – u07103

1

您可以标注您方面的领域类像这样:

@Inject 
SomeDependency someDependency 

然后问吉斯到依赖注入你的切面类通过在吉斯模块的configure()方法写的:

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

个为requestInjection文档说:

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

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

相关问题