J'ai une méthode de fournisseur dans un module annoté avec @Provides
:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
et j'ai annoté mon ChatServicePerformanceMonitor
avec @Singleton
. Dans mon code, où j'utilise cette instance, je ne peux pas avoir de guice l'injecter "passivement", en raison d'un framework que j'utilise qui construit la classe englobante (il n'utilise pas Guice, c'est donc la seule façon que je connaisse pour obtenir la référence):
chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);
Il semble que Guice ne respecte pas le @Singleton
annotation sur ma classe ChatServicePerformanceMonitor
. J'obtiens une instance pour chaque appel à injector.getInstance (ChatServicePerformanceMonitor.class).
Ajout du @Singleton
à la méthode du fournisseur semble résoudre ce problème:
@Provides @Singleton
public ChatServicePerformanceMonitor getChatServicePerfMon() {
...
}
Est-ce le comportement attendu? Il semble qu'un @Singleton
sur l'instance devrait être tout ce dont j'ai besoin.
Si vous créez le ChatServicePerformanceMonitor
comme ceci:
@Provides
public ChatServicePerformanceMonitor getChatServicePerfMon() {
return new ChatServicePerformanceMonitor();
}
alors votre annotation au niveau de la classe @Singleton
n'aura aucun effet car Guice ne crée pas l'objet, vous l'êtes. Guice ne peut appliquer la portée qu'aux objets qu'il crée. Il n'y a rien de mal à ajouter @Singleton
À votre méthode getChatServicePerfMon()
.
Si vous avez un constructeur sans argument (ou un constructeur @Inject
) Sur la classe ChatServicePerformanceMonitor
et que vous supprimez votre méthode @Provides
, Les appels continus à l'injecteur renverront le même singleton .
En attendant, cette fonctionnalité est disponible (testée avec Guice 4.0).
@Provides
les méthodes peuvent désormais également être annotées avec @Singleton
pour appliquer la portée. Voir https://github.com/google/guice/wiki/Scopes