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.
The @Singleton syntax is useful for annotating @Provides methods, or annotating the class itself (though I prefer to keep my scoping annotations inside modules).
The Guice module helps you to inject Guice managed components into your play application. The injection points are defined by the upcoming @javax. inject. Inject annotation, which is bundled with play at the moment.
Dependency Injection for Java Developers with Dagger & Guice Guice provides another way also to map bindings without creating a custom annoation. It allows so using @Named annotation.
Note that the only Guice-specific code in the above is the @Inject annotation. This annotation marks an injection point. Guice will attempt to reconcile the dependencies implied by the annotated constructor, method, or field.
In the meantime this feature is available (tested with Guice 4.0).
@Provides
methods may now be also annotated with @Singleton
to apply scope. See https://github.com/google/guice/wiki/Scopes
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With