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