使用没有注入器的Guice创建未知类

时间:2014-02-06 23:32:06

标签: guice

我们对我们的注射器进行了一次“仅”调用......

Application app = injector.getInstance(Application.class);
app.start();

这非常有效。在应用程序的深处,我们希望有一个特定的提供商或创建一个类的东西,更重要的是连接他的注入。它可能是AssistedInject的东西,但我不是100%肯定。我们需要类似下面的内容

private Provider<SomeInterface> stuff;

public SomeInterface create(Class runtimeInst) {
  return stuff.get(runtimeInst);
}

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

正如condit所提到的,如果您查看Injector文档中提供的“默认绑定”,您将看到Injector可以提供:

  
      
  • Injector实例本身
  •   
  • Provider<T>
  • 类型的每个绑定的T   
  • 正在注入的类的java.util.logging.Logger
  •   
  • 创建注射器的阶段
  •   

这意味着在任何给定的课程中,如果您告诉Guice如何绑定TProvider<T>,您可以始终@Inject T或{ {1}}和Guice将根据需要处理通过提供商的包装或解包。

在您的特定情况下,您似乎需要专门注入以下其中一项:

  • Provider<T>,返回您绑定的任何实现Provider<SomeInterface>

  • SomeInterface,您可以用它来准确指定您需要的Provider<SomeGuyImplementingSomeInterface>实施者

  • SomeInterface(您已将@SomeAnnotation Provider<SomeInterface>绑定到某个模块中的特定实现者@SomeAnnotation SomeInterface,如果您希望能够配置哪个非默认实现在模块级别一直使用

  • SomeGuyImplementingSomeInterface,如果其他所有方法都失败了,你绝对需要根据一个保持变量的类文字从Guice获取一个实例,这样你就可以直接调用Injector。这将是您用于创建最顶层类的完全相同的Injector,并且在您不必自己保留Injector引用的情况下将完全相同。除非你确实需要,否则尽量避免这种解决方案;只注入您需要的内容将使您的测试更容易,并使您的依赖更加明显。