web-dev-qa-db-fra.com

Guice: comment configurez-vous un @Provides et @Singleton dans un module dans ce cas?

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.

23
Alper Akture

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 .

21
condit

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

26
codejanovic