Java 如何使用Guice将必要的对象注入AspectJ方面
有没有一种方法可以使用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
@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方面基本上是静态的,并且
我认为你的选择是:
@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注入方面的实用方法。