bind(Foo.class).to(Bar.class)与bind(Foo.class).toInstance(new Bar())之间的区别

时间:2016-07-28 16:23:32

标签: guice

bind(Foo.class).to(Bar.class)与bind(Foo.class).toInstance(new Bar())之间的区别是什么;

另外,使用后一种调用构造函数new Bar()的方法可以正确地注入字段吗?

1 个答案:

答案 0 :(得分:9)

bind(Foo.class).to(Bar.class)linked binding:你告诉Guice"每当有人要求Foo时,请给他们一个Bar而不是#34;。你并没有告诉Guice如何创建一个Bar;这意味着有一个@Inject-annotated或public zero arg构造函数,并且你允许Guice做它通常做的所有事情包括字段注入。你也没有告诉Guice是否要记住Bar实例并保留它,这意味着它每次都会创建一个新的Bar。 (请注意,如果您愿意,这并不能阻止您bind(Bar.class).to(Baz.class)bind(Bar.class).toInstance(new Baz());如果您在技术上不让Bar成为implicit or JIT binding, }。)

bind(Foo.class).toInstance(new Bar())instance binding。你告诉Guice"每当有人要求Foo时,请给他们这个 Bar而不是"。 Guice并没有尝试创建一个Bar,所以它并没有尝试注入构造函数参数,也没有尝试创建一个不同的Bar:你总是得到同一个。 更新:感谢Tavian,我忘记了automatic injections允许对toInstance绑定进行字段注入。请注意,这些都不会影响Bar的注入请求,只是Foo。

因此,前者允许注入并且每次都创建一个新实例,后者允许您手动创建实例并且每次都返回相同的实例。这些也可以是两个单独的决定:

  • 要始终返回相同的实例,您可以使用@Singleton标记该类,或者使您的绑定.in(Singleton.class)。有关详细信息和选项,请参阅Scopes。 Guice创建实例,因此您可以访问字段注入。
  • 让您手动创建实例而无需注入字段(但允许调用静态工厂方法或自定义初始化方法),bind to a Providercreate a @Provides method。 Guice不会注入领域,因为你已经自己创造了这个领域。

    那些提供者/ @提供绑定也可以成为Singleton,类似于上面的toInstance,但并不要求你在注入器创建时创建你的实例。