我已经阅读了有关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<>的一种较短方法。如果您不需要它们,请不要使用它们。如果创建对象比简单的构造函数调用复杂,则通常应使用它们。

10-06 15:01