当前位置: 首页 > 知识库问答 >
问题:

Guice绑定和FactoryModuleBuilder

淳于哲
2023-03-14

我是一个尝试使用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()方法的接口,该方法返回一个使用者

我的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)
    

    还是在这种情况下我的理解是错误的?如果不指定bind语句,在Guice尝试自动关联对象时,会得到一个instance not bound异常。

    谢谢你事先的帮助。

  • 共有1个答案

    吴高洁
    2023-03-14

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

    错误的地方是XMLConsumer的定义。Guice应该使用的构造函数必须用@inject进行注释。

    然后您可以向注入器请求使用者

     类似资料:
    • 由于绑定是在绑定模块中定义的,Google Guice 会在需要注入依赖项时使用它们。如果不存在绑定,它可以尝试创建即时绑定。绑定模块中存在的绑定称为显式绑定并且具有更高的优先级,而即时绑定称为隐式绑定。如果两种类型的绑定都存在,则考虑使用显式绑定进行映射。 以下是三种类型的即时绑定的示例。 绑定类型 描述 可注入的构造函数 非私有、无参数构造函数有资格进行即时绑定。另一种方法是使用@Inject

    • 主要内容:Google Guice 内置绑定 示例,输出Google Guice 为java.util.logging.Logger类提供了内置绑定。Logger 的名称会自动设置为注入 Logger 的类的名称。请参阅下面的示例。 Google Guice 内置绑定 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

    • 主要内容:使用@Named 注解注入,Google Guice 常量绑定 完整示例,输出Guice 提供了一种使用值对象或常量创建绑定的方法。下面例子以配置 JDBC URL 为例。 使用@Named 注解注入 这可以使用 toInstance() 方法来实现。 Google Guice 常量绑定 完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

    • 主要内容:Google Guice 链接绑定 完整示例,输出在链接绑定中,Guice 将类型映射到其实现。在下面的示例中,我们将 SpellChecker 接口与其实现 SpellCheckerImpl 进行了映射。 我们还可以将具体类映射到它的子类。请参阅以下示例: 在这里,我们链接了绑定。让我们在完整示例中查看结果。 Google Guice 链接绑定 完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java

    • 我有一个用例,我使用的是基于Spring的外部jar,而我的代码是基于Googleguice的。 我正在尝试通过编写模块在我的依赖项jar的此类中注入依赖项。 外部类: 我可以在我的模块中使用@provides方法中的setter设置成员,但@inject成员为空,我得到了countEvent和durationEvent的NullPointerException。 我的代码使用下面的provide

    • 主要内容:Google Guice 构造方法绑定 完整示例,输出Google Guice 提供了一种使用 toConstructor() 方法创建与对象的特定构造函数的绑定的方法。 请参阅下面的完整示例。 Google Guice 构造方法绑定 完整示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。