【发布时间】: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