I have a provider method in a module annotated with @Provides
:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
and I have annotated my ChatServicePerformanceMonitor
with @Singleton
. In my code, where I use this instance, I can't have guice "passively" inject it, due to a framework I'm using that's constructing the enclosing class (it does not use Guice, so this is the only way I know of to get the reference):
chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
It seems Guice does not respect the @Singleton
annotation on my ChatServicePerformanceMonitor
class. I get an instance for every call to injector.getInstance(ChatServicePerformanceMonitor.class).
Adding the @Singleton
to the provider method seems to fix this:
@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Is that the expected behavior? It seems an @Singleton
on the instance should be all I would need.
If you're creating the ChatServicePerformanceMonitor
like this:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
return new ChatServicePerformanceMonitor();
}
then your class level @Singleton
annotation will have no effect because Guice isn't creating the object, you are. Guice can only enforce scope on objects it creates. There's nothing wrong with adding @Singleton
to your getChatServicePerfMon()
method.
If you have a no-argument constructor (or an @Inject
constructor) on the ChatServicePerformanceMonitor
class and you remove your @Provides
method then continual calls to the injector will return the same singleton.