我是 Guice 的新手,我不确定我是否理解这两者之间的区别
1) untargeted bind - 我什么时候需要使用它?
bind(Logger.class);
2 )'toInstance()` 绑定(bind) - 如何初始化一个具有 ctor 和依赖项的对象?还是只针对没有依赖关系的数据对象?
bind(Logger.class).toInstance(new Logger(..?..));
3) 不在
中写任何绑定(bind) @Override
protected void configure() {
}
当我运行时,以上任何一项都发生了什么
我什么时候应该选择其中的任何一个?
最佳答案
- 非目标绑定(bind):您很少需要使用它们,但如果
- 您想指定一个范围(例如,
bind(Untargetted.class).in(Scopes.SINGLETON);
) - 您想将绑定(bind)保留在
PrivateModule
中 - 你有required explicit bindings
- 您想指定一个范围(例如,
- 你是对的,通常你不能对具有构造函数依赖性的对象使用
toInstance()
。它对于非 Guicey 对象更有用,例如您必须使用new
创建的数据对象或库类。 - 当您注入(inject)未绑定(bind)到任何
Module
中的类型时,Guice 会创建一个 just-in-time binding为了它。该行为几乎与bind(Untargetted.class);
相同
非目标绑定(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/