【发布时间】:2013-02-26 23:04:06
【问题描述】:
这个问题是 Using guice for a framework with injected classes, proper way to initialize? 的延续,我已经尝试实施,也尝试了其他方法来解决这个问题,但到目前为止没有任何效果。
主要问题是这个。我有一个InterfaceA 和InterfaceB,它们暴露在API 的不同部分。有两个类同时实现了这两个接口,TestClass 和 RealClass,因此根据我是在测试还是在做其他事情,我可以执行以下操作:
bind(InterfaceA.class).to(TestClass.class);
bind(InterfaceB.class).to(TestClass.class);
或者,用于生产:
bind(InterfaceA.class).to(RealClass.class);
bind(InterfaceB.class).to(RealClass.class);
我对使用这些类有两个要求:
- 我需要
TestClass或RealClass的相同实例绑定到InterfaceA和InterfaceB的所有注入;所以,就像一个单例模式,除了: - 单例仅适用于特定范围或子注入器,其中许多是在程序执行期间创建的。
默认的无范围方法会导致为每个接口注入创建多个 RealClass/TestClass 实例。我不希望这样,所以我尝试使用范围、子注入器和其他方法来实现它。没有任何效果:
-
Child injector approach:我创建了一个新的注入器并尝试将
TestClass或RealClass绑定到该注入器中的单例实例。问题是,在父注入器中配置了TestClass还是RealClass,而since it's a singleton, it's already instantiated(除非在Stage.DEVELOPMENT中)。例如,无法在父注入器中将InterfaceA绑定到TestClass,然后在子注入器中将其重新绑定为单例。 - 范围方法:I create a custom scope 并注解
TestClass和RealClass。然后,我进入和退出此范围以获取该范围内的单个实例。问题是我的代码是多线程的,并且从一个线程更改范围会影响全局注入器可以看到的内容,并且会影响创建其他实例。 -
结合子注入器和范围方法。我尝试为每次使用此自定义范围创建一个子注入器,但随后在父级中绑定
RealClass失败并出现No scope is bound to name.package.WhateverScope.因为它似乎坚持
WhateverScope始终可用,而不仅仅是在子注射器中。
所有这些问题似乎是由于我需要能够配置是否在父级中使用TestClass 或RealClass,但随后能够以单例的形式实例化它们一组特定的对象。我正在为如何完成这项工作而烦恼!
顺便说一句,Guice 范围的文档很糟糕,几乎无法理解。 This article 是唯一一个让我走到任何地方的人:
【问题讨论】:
标签: java dependency-injection guice multiple-inheritance