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

Gli*_*ide 0 guice

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

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

Jef*_*ica 10

bind(Foo.class).to(Bar.class)是一个链接的绑定:你告诉Guice"每当有人要求Foo时,给他们一个吧".你不是在告诉Guice如何创建一个Bar; 这意味着有一个@Inject-annotated或public zero arg构造函数,你允许Guice做它通常做的所有事情,包括场注入.你也没有告诉Guice是否要记住Bar实例并保留它,这意味着它每次都会创建一个新的Bar.(请注意,这并不妨碍您bind(Bar.class).to(Baz.class)或者bind(Bar.class).toInstance(new Baz())如果您愿意;没有其中一个您在技术上让它Bar成为隐式或JIT绑定.)

bind(Foo.class).toInstance(new Bar())是一个实例绑定.你告诉Guice"只要有人要求Foo,就给他们这个吧吧".Guice不会尝试创建一个Bar,因此它不会尝试注入构造函数参数,也不会尝试创建一个不同的Bar:你总是会得到同一个.更新:谢谢Tavian,我忘记了自动进样确实允许在toInstance绑定上进行现场注入.请注意,这些都不会影响Bar的注入请求,只会影响Foo.

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

  • 要始终返回相同的实例,您可以使用标记该类@Singleton,或进行绑定.in(Singleton.class).有关更多详细信息和选项,请参阅范围.Guice创建实例,因此您可以访问字段注入.
  • 要让您手动创建实例而不注入字段(但允许调用静态工厂方法或自定义初始化方法),请绑定到Provider创建@Provides方法.Guice不会注入田地,因为你已经自己创造了.

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

  • 还有一个区别是吉斯该方法只截取当你让吉斯为您创建的实例(不论范围结合)的作品.请参阅此处的限制:https://github.com/google/guice/wiki/AOP (2认同)