Guice:在这种情况下,如何在模块中配置@Provides和@Singleton?

时间:2013-04-11 19:29:36

标签: guice

我在使用@Provides注释的模块中有一个提供程序方法:

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}

我已使用ChatServicePerformanceMonitor注释了我的@Singleton。在我的代码中,我使用这个实例,我无法“被动地”注入它,因为我正在使用的框架构建封闭类(它不使用Guice,所以这是我知道的唯一方法得到参考):

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);

Guice似乎不尊重我@Singleton类的ChatServicePerformanceMonitor注释。每次调用inject.getInstance(ChatServicePerformanceMonitor.class)时都会得到一个实例。

@Singleton添加到提供程序方法似乎解决了这个问题:

@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}

这是预期的行为吗?似乎实例上的@Singleton应该是我所需要的。

3 个答案:

答案 0 :(得分:25)

与此同时,此功能可用(使用Guice 4.0测试)。

@Provides方法现在也可以使用@Singleton进行注释以应用范围。见https://github.com/google/guice/wiki/Scopes

答案 1 :(得分:19)

如果您正在创建ChatServicePerformanceMonitor,请执行以下操作:

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  return new ChatServicePerformanceMonitor();
}

然后你的班级@Singleton注释将无效,因为Guice不会创建对象,你是。 Guice只能对它创建的对象强制执行范围。将@Singleton添加到getChatServicePerfMon()方法中没有错。

如果@Inject类上有无参数构造函数(或ChatServicePerformanceMonitor构造函数),并且删除了@Provides方法,则对注入器的连续调用将返回相同的单例

答案 2 :(得分:-1)

你总是可以做一个简单的方法:

private ChatServicePerformanceMonitor perfMon = null;

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  if (perfMon == null) {
    perfMon = new ChatServicePerformanceMonitor();
  }

  return perfMon;
}