1

我想使用 Guice 来生成实例(实际上是模块/依赖注入上下文的单例/单实例),但是将一些托管实例包装在代理中。

这背后的想法是围绕一些处理“一次一个”资源的项目添加一个同步层。我想出的唯一解决方案是创建两个注入器。

鉴于下面的代码,

public class ApplicationContext {
    private Injector injector;
    public <T> T get(Class<? extends T> cls) {
        return injector.getInstance(cls);
    }

    public ApplicationContext() {
        injector = Guice.createInjector(new Module() {
            binder.bind(InterfaceOne.class).to(ImplementationOne.class);
            binder.bind(InterfaceTwo.class).to(ImplementationTwo.class);
            binder.bind(InterfaceThree.class).to(ImplementationThree.class);
        });
    }
}

}

whereImplementationThree取决于InterfaceTwoImplementationTwo反过来取决于InterfaceOne

我现在想要的是,在ImplementationTwo实例化之后,我想在将它注入到ImplementationThree. 所以:

  • 我想用 GuiceImplementationOne被注入ImplementationTwo
  • ImplementationTwo被注入之前ImplementationThree,我想把它包起来。

我希望看到的是一个 Guice 拦截器,它在依赖项的实例化和注入之后,但在它被移交给注入器上下文之前被调用。

我可以使用Providerfor ImplementationTwo,但我不知道如何InterfaceOne从 Guice 获取实例。

4

2 回答 2

3

Provider 方法也可以使用注入。尝试

@Inject @Provides
public InterfaceTwo provideInterfaceTwo(InterfaceOne i){
    return InterfaceTwoImplementation
}
于 2013-06-03T08:52:15.947 回答
0

为什么不使用普通的旧 Guice AOP 支持?就像是

@SynchronizedAccess
public void foo(...){
    ...
}

这样,您只需查看代码就可以看到该方法还有更多内容。

如果您绝对想将东西包装在代理中:

如果您只有几个要代理的类,那么 @acerberus 建议可以正常工作。

要自动化,您可以使用自定义注入的一部分#afterInjection ,并使用反射将字段重新分配给您的代理。

我发现使用锁进行编程有点过时,而我们周围有akka但 YMMV 之类的东西。

于 2013-06-03T15:18:58.000 回答