Guice Binding API by Example

时间:2013-09-03 13:56:29

标签: java dependency-injection inversion-of-control guice

我已经阅读了几篇关于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(...)时,我假设使用了公共no-arg ctor,并且每次都返回一个新实例?
  2. 上面的#2,是用于impl次请求的Service.class个实例,还是新的请求?
  3. 与上面的#3相同,但现在指定了Scopes.SINGLETON
  4. 以上代码是否正常或我应该使用bindConstant()?如果是这样,怎么/为什么?
  5. 在什么情况下我应该使用所谓的provider methods?我有点了解该页面上的示例,但在我的代码中找到它们的真实用例时,我现在感到窒息。
  6. 提前致谢!

1 个答案:

答案 0 :(得分:1)

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