我正试图在我的一个项目中使用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,因为我希望Guice为我这样做。这是正确的吗?
我似乎需要绑定语句
绑定(DataQueue.class)。为了(FIFODataQueue.class);
但为什么我需要这个。我在我的安装中指定相同的信息不是说
.implement(DataQueue.class, FIFODataQueue.class)
在这种情况下,我的理解是错误的吗?
如果我没有指定绑定语句,那么当Guice尝试自动装配对象时,我会得到一个未绑定异常的实例。
提前感谢您的帮助。
答案 0 :(得分:0)
如果您的代码或多或少完整,那么您使用FactoryModuleBuilder就会过度。 FactoryModuleBuilder适用于无法注入所有参数以创建对象的情况。它们不用于直接注入对象,它们用于注入工厂。 ConsumerFactory
未使用工厂创建DataQueue
,它使用显式绑定(这就是您需要它的原因)。
出错的地方在XMLConsumer
的定义中。构造函数Guice应该使用必须使用@Inject
注释。
然后你可以向你的注射者询问Consumer
。