Guice 绑定和 FactoryModuleBuilder

Guice binding and FactoryModuleBuilder

我正在尝试将 Guice(这里是新手!!)用于我的一个项目。

所以我有一个

interface Consumer{    
}

我的实现是

class XMLConsumer implements Consumer {
      XMLConsumer(DataQueue queue){
      }
}

我还定义了 DataQueue 接口

interface DataQueue {

}

DataQueue的实现如下

class FIFODataQueue implements DataQueue{
      ...
}

在我的 AppModule.configure 方法中,我有以下代码

class MyModule extends AbstractModule {
    protected void configure(){
      // Why do I need this ???
      bind(DataQueue.class).to(FIFODataQueue.class);

      // My factories are
      install(new FactoryModuleBuilder()
      .implement(DataQueue.class, FIFODataQueue.class)
      .build(DataQueueFactory.class));

      install(new FactoryModuleBuilder()
      .implement(Consumer.class, XMLConsumer.class)
      .build(ConsumerFactory.class));
    }
}

我的 ConsumerFactory 是一个带有 create() 方法的接口,returns 一个 Consumer

我的 DataQueueFactory 是一个带有 create() 方法的接口,returns 一个 DataQueue

在我的主要方法中我有

final Injector injector = Guice.createInjector();
ConsumerFactory consFactory = injector.getInstance(ConsumerFactory.class);
Consumer cons = consFactory.create();

所以我的问题是

  1. 我没有明确创建 DataQueue,因为我希望 Guice 为我做这件事。这是正确的吗??

  2. 我好像需要绑定语句

    绑定(DataQueue.class).to(FIFODataQueue.class);

但我为什么需要这个。我在我的安装中指定了相同的信息,不是说

.implement(DataQueue.class, FIFODataQueue.class)

或者我的理解有误? 如果我不指定绑定语句,当 Guice 尝试自动装配对象时,我会得到一个实例未绑定异常。

提前感谢您的帮助。

如果您的代码或多或少是完整的,那么您在使用 FactoryModuleBuilder 时做得太过火了。 FactoryModuleBuilder 适用于无法注入所有参数来创建对象的情况。它们不用于直接注入对象,它们用于注入工厂。 ConsumerFactory 没有使用工厂来创建 DataQueue,它使用显式绑定(这就是您需要它的原因)。

你错在 XMLConsumer 的定义中。 Constructor Guice 应该使用必须用 @Inject.

注释

然后你可以向你的注射器要一个Consumer