我在使用@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
应该是我所需要的。
答案 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;
}