我们对我们的注射器进行了一次“仅”调用......
Application app = injector.getInstance(Application.class);
app.start();
这非常有效。在应用程序的深处,我们希望有一个特定的提供商或创建一个类的东西,更重要的是连接他的注入。它可能是AssistedInject的东西,但我不是100%肯定。我们需要类似下面的内容
private Provider<SomeInterface> stuff;
public SomeInterface create(Class runtimeInst) {
return stuff.get(runtimeInst);
}
有没有办法做到这一点?
答案 0 :(得分:1)
正如condit所提到的,如果您查看Injector文档中提供的“默认绑定”,您将看到Injector可以提供:
- 此
Injector
实例本身- 类型的每个绑定的
Provider<T>
T
- 正在注入的类的java.util.logging.Logger
- 创建注射器的阶段
这意味着在任何给定的课程中,如果您告诉Guice如何绑定T
或Provider<T>
,您可以始终@Inject
T
或{ {1}}和Guice将根据需要处理通过提供商的包装或解包。
在您的特定情况下,您似乎需要专门注入以下其中一项:
Provider<T>
,返回您绑定的任何实现Provider<SomeInterface>
SomeInterface
,您可以用它来准确指定您需要的Provider<SomeGuyImplementingSomeInterface>
实施者
SomeInterface
(您已将@SomeAnnotation Provider<SomeInterface>
绑定到某个模块中的特定实现者@SomeAnnotation SomeInterface
,如果您希望能够配置哪个非默认实现在模块级别一直使用
SomeGuyImplementingSomeInterface
,如果其他所有方法都失败了,你绝对需要根据一个保持变量的类文字从Guice获取一个实例,这样你就可以直接调用Injector
。这将是您用于创建最顶层类的完全相同的Injector,并且在您不必自己保留Injector引用的情况下将完全相同。除非你确实需要,否则尽量避免这种解决方案;只注入您需要的内容将使您的测试更容易,并使您的依赖更加明显。