1

我已经阅读了几篇关于 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);

所以我的问题,正如上面的代码片段所暗示的那样:

  1. 使用时to(...),我假设使用了 public no-arg ctor,并且每次都返回一个新实例?
  2. 根据上面的#2,是同一个impl实例用于Service.class请求,还是返回一个新实例?
  3. 与上面的#3 相同,但现在Scopes.SINGLETON指定了。
  4. 上面的代码可以还是我应该使用bindConstant()?如果是这样,如何/为什么?
  5. 在什么情况下我应该使用所谓的提供者方法?我有点理解该页面上的示例,但现在在我的代码中为它们找到真实世界的用例时感到窒息。

提前致谢!

4

1 回答 1

1
  1. 要么使用公共的无参数构造函数,要么使用带有@Inject 注释的构造函数(推荐)。每次都会返回一个新实例,除非您在 ServiceImpl 上指定范围(通过后面的bind(ServiceImpl.class).in(...)行或@SingletonServiceImpl.
  2. 在这种情况下,impl每次注入都使用相同的实例Service
  3. 这是一个编译错误,有充分的理由——您不能在toInstance绑定上指定范围。
  4. bindConstant()应该用于诸如原始或字符串类型的配置参数之类的东西。有关更多信息,请参阅此答案
  5. @Provides方法只是写Provider<>s 的一种更短的方式。如果您不需要它们,请不要使用它们。如果创建对象比简单的构造函数调用更复杂,则通常应该使用它们。
于 2013-09-03T14:48:13.193 回答