27

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

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

我已经ChatServicePerformanceMonitor@Singleton. 在我使用这个实例的代码中,我不能让 guice “被动地”注入它,因为我正在使用一个构建封闭类的框架(它不使用 Guice,所以这是我知道的唯一方法获取参考):

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);

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

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

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

这是预期的行为吗?似乎@Singleton我只需要一个实例。

4

3 回答 3

30

与此同时,这个特性是可用的(用 Guice 4.0 测试过)。

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

于 2016-03-23T12:20:45.870 回答
23

如果你正在创建ChatServicePerformanceMonitor这样的:

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

那么您的类级别@Singleton注释将无效,因为 Guice 没有创建对象,您是。Guice 只能对它创建的对象强制执行范围。添加@Singleton到您的getChatServicePerfMon()方法没有任何问题。

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

于 2013-04-11T21:32:50.540 回答
-5

你总是可以只做非常简单的方法:

private ChatServicePerformanceMonitor perfMon = null;

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

  return perfMon;
}
于 2018-04-12T16:09:05.500 回答