Guice绑定和FactoryModuleBuilder

时间:2018-01-26 19:50:45

标签: java dependency-injection guice

我正试图在我的一个项目中使用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()方法的接口,它返回一个Consumer

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

在我的主要方法中我有

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

所以我的问题是

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

  2. 我似乎需要绑定语句

    绑定(DataQueue.class)。为了(FIFODataQueue.class);

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

    .implement(DataQueue.class, FIFODataQueue.class)
    
    在这种情况下,我的理解是错误的吗? 如果我没有指定绑定语句,那么当Guice尝试自动装配对象时,我会得到一个未绑定异常的实例。

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

出错的地方在XMLConsumer的定义中。构造函数Guice应该使用必须使用@Inject注释。

然后你可以向你的注射者询问Consumer