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

Alp*_*ure 22 guice

我在一个注释的模块中有一个提供者方法@Provides:

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
Run Code Online (Sandbox Code Playgroud)

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

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

@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?似乎@Singleton实例应该是我需要的全部内容.

cod*_*vic 25

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

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


con*_*dit 20

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

@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
  return new ChatServicePerformanceMonitor();
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 根据经验:使用DI/Guice时,请勿使用"new"一词. (6认同)
  • 好,谢谢。我在那里做新的。我猜因为Guice在调用我的提供者方法,所以我认为它仍将强制执行Singleton行为(因为我没有调用提供者方法,所以他们可以这样做)并且可以进行管理。猜猜我错了! (2认同)