Guice: comment configurer un @Provides et @Singleton dans un module dans ce cas?
J'ai un fournisseur de méthode dans un module annotée avec @Fournit:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
et j'ai annoté mon ChatServicePerformanceMonitor avec @Singleton. Dans mon code, où j'utilise cette instance, je n'ai pas guice "passivement" injecter, en raison d'un cadre que je suis en utilisant que la construction de la classe englobante (il n'utilise pas de Guice, c'est donc le seul moyen que je connaisse pour obtenir la référence):
chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
Il semble Guice ne respecte pas les @Singleton annotation sur mon ChatServicePerformanceMonitor classe. Je reçois une instance pour chaque appel de l'injecteur.getInstance(ChatServicePerformanceMonitor.class).
L'ajout de l' @Singleton pour le fournisseur méthode semble résoudre ce problème:
@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Est que le comportement attendu? Il semble qu'un @Singleton sur l'instance devrait être tous j'aurais besoin.
source d'informationauteur Alper Akture
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la création de la
ChatServicePerformanceMonitor
comme ceci:alors votre niveau de classe
@Singleton
annotation n'aura aucun effet, parce que Guice n'est pas la création de l'objet, vous l'êtes. Guice ne peuvent faire valoir portée sur les objets qu'il crée. Il n'y a rien de mal avec l'ajout de@Singleton
à votregetChatServicePerfMon()
méthode.Si vous avez un constructeur sans argument (ou un
@Inject
constructeur) sur laChatServicePerformanceMonitor
classe et vous retirez votre@Provides
méthode, puis appels continuels de l'injecteur sera de retour le même singleton.En attendant, cette fonctionnalité est disponible (testé avec Guice 4.0).
@Provides
méthodes peuvent maintenant également être annotée avec@Singleton
pour appliquer la portée. Voir https://github.com/google/guice/wiki/ScopesVous pouvez toujours juste les morts-approche simple: