java - 非目标绑定(bind)与 `toInstance()` 绑定(bind)

标签 java dependency-injection inversion-of-control guice

我是 Guice 的新手,我不确定我是否理解这两者之间的区别

1) untargeted bind - 我什么时候需要使用它?

bind(Logger.class);

2 )'toInstance()` 绑定(bind) - 如何初始化一个具有 ctor 和依赖项的对象?还是只针对没有依赖关系的数据对象?

bind(Logger.class).toInstance(new Logger(..?..));

3) 不在

中写任何绑定(bind)
    @Override
    protected void configure() {
}

当我运行时,以上任何一项都发生了什么

我什么时候应该选择其中的任何一个?

最佳答案

  1. 非目标绑定(bind):您很少需要使用它们,但如果
  2. 你是对的,通常你不能对具有构造函数依赖性的对象使用toInstance()。它对于非 Guicey 对象更有用,例如您必须使用 new 创建的数据对象或库类。
  3. 当您注入(inject)未绑定(bind)到任何 Module 中的类型时,Guice 会创建一个 just-in-time binding为了它。该行为几乎与 bind(Untargetted.class);
  4. 相同

非目标绑定(bind)和 toInstance() 绑定(bind)之间的主要区别是 toInstance() 绑定(bind)将是单例(“显然”——只有一个实例!),但是与大多数其他绑定(bind)一样,非目标绑定(bind)在默认情况下没有作用域。因此,如果不同的类注入(inject)一个 Untargetted,它们将获得不同的实例,除非您在其上放置一个范围。

另一个区别是,当您不使用toInstance() 时,Guice 会为您创建实例,启用类似aspect-oriented programming 的功能。 .

通常,除非万不得已,否则您最好不要使用 toInstance() 绑定(bind)。无目标绑定(bind)的优点是更明确,但将它们全部列出可能会很冗长,因此通常使用即时绑定(bind)。特别是在这种情况下:

bind(Interface.class)
        .to(Implementation.class);

// Technically, Guice creates a just-in-time binding for Implementation here

关于java - 非目标绑定(bind)与 `toInstance()` 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540204/

相关文章:

java - 如何从 Java 8 中的流中收集两个总和

java - 解码原始字节数组后如何更改特定字段值?

java - 方法定义中的 "throws ArithmeticException"只是装饰性的吗?

javascript - angularjs 在不同文件中为同一模块定义服务

c# - CaSTLe Windsor - 控制 transient 组件的创建

c# - 如何在 Blazor Server 后端正确使用依赖注入(inject)?

javascript - 需要帮助让 Scatter (IOC) 服务正常运行

java - 如何在不使用预制类的情况下在 Java 中创建可扩展动态数组?

asp.net-mvc-3 - 定义WebActivator.PreApplicationStartMethod类的初始化顺序

java - 如何在使用spring自动布线时传递构造函数参数?