gpt4 book ai didi

java - Guice 绑定(bind)和 FactoryModuleBuilder

转载 作者:太空宇宙 更新时间:2023-11-04 10:45:29 25 4
gpt4 key购买 nike

我正在尝试使用 Guice(这里是新手!!)来完成我的一个项目。

所以我有一个

interface Consumer{    
}

我的实现是

class XMLConsumer implements Consumer {
XMLConsumer(DataQueue queue){
}
}

我还将 DataQueue 接口(interface)定义为

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));
}
}

My ConsumerFactory 是一个带有返回 Consumer 的 create() 方法的接口(interface)

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

在我的主要方法中,我有

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

所以我的问题是

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

  2. 我似乎需要绑定(bind)语句

    bind(DataQueue.class).to(FIFODataQueue.class);

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

.implement(DataQueue.class, FIFODataQueue.class)

或者在这种情况下我的理解是错误的?如果我不指定绑定(bind)语句,当 Guice 尝试 Autowiring 对象时,我会得到一个实例未绑定(bind)异常。

感谢您提前提供的帮助。

最佳答案

如果您的代码或多或少完整,则说明您使用 FactoryModuleBuilder 做得太过分了。 FactoryModuleBuilder 适用于无法注入(inject)所有参数来创建对象的情况。它们不用于直接注入(inject)对象,而是用于注入(inject)工厂。 ConsumerFactory 不使用工厂来创建 DataQueue,它使用显式绑定(bind)(这就是您需要它的原因)。

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

然后你可以向你的注入(inject)器询问一个Consumer

关于java - Guice 绑定(bind)和 FactoryModuleBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com