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上面类似,但不要求你在创建注入器时创建实例.
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |