有没有一种方法可以使用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);
}
}
但是,有一些不良的开销。
@OlivierGrégoire是的,我写的问题:)如果我尝试注入字段(没有定义的方面构造函数),方面将被调用,但字段complexServiceMangedByGuice不会被设置。 – 4evertoblerone