我已经阅读了有关Guice(3.0)的几篇文章和教程,现在有一些挥之不去的问题,然后才能将它们“捆绑在一起”。
// 1. Binds via public, no-arg "ServiceImpl()" ctor?
bind(Service.class).to(ServiceImpl.class);
// 2. Every client-side request for a Service instance returns the same
// ServiceImpl instance?
ServiceImpl impl = new ServiceImpl(...);
bind(Service.class).toInstance(impl);
// 3. Every client-side request for a Service instance returns the same
// SINGLETON ServiceImpl instance?
ServiceImpl impl = new ServiceImpl(...);
bind(Service.class).in(Scopes.SINGLETON).toInstance(impl);
// 4. Should this be a call too bindConstant() instead of toInstance()
// instead? If so, how/why?
Integer timeout = 1000 * 60; // 60 seconds
bind(Integer.class).named(Names.named("TIMEOUT")).toInstance(timeout);
因此,如上面的代码片段所暗示的,我的问题是:
使用
to(...)
时,我假定使用了公共的无参数ctor,并且每次都返回一个新实例?根据上述#2,是否曾经对
impl
请求使用相同的Service.class
实例,还是返回了一个新实例?与上面的#3相同,但现在指定了
Scopes.SINGLETON
。上面的代码可以吗?还是应该使用
bindConstant()
?如果是这样,如何/为什么?在什么情况下应该使用所谓的provider methods?我有点理解该页面上的示例,但是现在在我的代码中为他们找到真实的用例时,我感到很烦。
提前致谢!
最佳答案
使用公共无参数构造函数,或使用@Inject注释的构造函数(建议使用)。每次都返回一个新实例,除非您在ServiceImpl上指定范围(通过后面的bind(ServiceImpl.class).in(...)
行或@Singleton
上的ServiceImpl
注释)。
在这种情况下,每次impl
注入都使用相同的Service
实例
有充分的理由,这是一个编译错误-您不能在toInstance
绑定上指定范围。bindConstant()
应该用于诸如原始或String类型的配置参数之类的东西。有关更多信息,请参见this answer。@Provides
方法只是编写Provider<>
的一种较短方法。如果您不需要它们,请不要使用它们。如果创建对象比简单的构造函数调用复杂,则通常应使用它们。