Guice绑定和FactoryModuleBuilder

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Guice绑定和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()方法的接口,它返回一个Consumer

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

在我的主要方法中我有

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

所以我的问题是

  1. 我没有明确创建数据队列,因为我希望伙计们为我这样做。它是否正确??
  2. 我似乎需要绑定语句 绑定(DataQueue.class)。为了(FIFODataQueue.class);

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

.implement(DataQueue.class, FIFODataQueue.class)

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

感谢您的帮助。

答案

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

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

然后你可以问你的注射器是否有Consumer

以上是关于Guice绑定和FactoryModuleBuilder的主要内容,如果未能解决你的问题,请参考以下文章

OptionalBinding 使用 Guice 避免用户绑定

Guice 注入空指针

子模块的故障安全注入器。 google guice 中的可选绑定

模块管理 Guice

Apache Druid源码导读--Google guice DI框架

Apache Druid源码导读--Google guice DI框架