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();
所以我的问题是
- 我没有明确创建数据队列,因为我希望伙计们为我这样做。它是否正确??
- 我似乎需要绑定语句 绑定(DataQueue.class)。为了(FIFODataQueue.class);
但为什么我需要这个。我在我的安装中指定相同的信息不是说它
.implement(DataQueue.class, FIFODataQueue.class)
或者在这种情况下我的理解是错误的?如果我没有指定绑定语句,那么当Guice尝试自动装配对象时,我会得到一个未绑定异常的实例。
感谢您的帮助。
如果您的代码或多或少完整,那么您使用FactoryModuleBuilder就会过度。 FactoryModuleBuilder适用于无法注入所有参数以创建对象的情况。它们不用于直接注入对象,它们用于注入工厂。 ConsumerFactory
没有使用工厂创建DataQueue
,它使用显式绑定(这就是你需要它的原因)。
你出错的地方是XMLConsumer
的定义。构造函数Guice应该使用必须用@Inject
注释。
然后你可以问你的注射器是否有Consumer
。
以上是关于Guice绑定和FactoryModuleBuilder的主要内容,如果未能解决你的问题,请参考以下文章
OptionalBinding 使用 Guice 避免用户绑定
子模块的故障安全注入器。 google guice 中的可选绑定