guice

Guice: ¿cómo configurar un @Provides y @Singleton en un módulo en este caso?



(3)

Mientras tanto, esta función está disponible (probada con Guice 4.0).

@Provides métodos @Provides ahora también se pueden anotar con @Singleton para aplicar el alcance. Consulte https://github.com/google/guice/wiki/Scopes

Tengo un método de proveedor en un módulo anotado con @Provides :

@Provides public ChatServicePerformanceMonitor getChatServicePerfMon() { ... }

y he anotado mi ChatServicePerformanceMonitor con @Singleton . En mi código, donde uso esta instancia, no puedo hacer que Guice lo inyecte "pasivamente", debido a un marco que estoy usando para construir la clase adjunta (no usa Guice, así que esta es la única manera que conozco de para obtener la referencia):

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class);

Parece que Guice no respeta la anotación @Singleton en mi clase ChatServicePerformanceMonitor . Obtengo una instancia por cada llamada a injector.getInstance (ChatServicePerformanceMonitor.class).

Agregar el @Singleton al método del proveedor parece solucionar esto:

@Provides @Singleton public ChatServicePerformanceMonitor getChatServicePerfMon() { ... }

¿Es ese el comportamiento esperado? Parece que un @Singleton en la instancia debería ser todo lo que necesitaría.


Si está creando ChatServicePerformanceMonitor esta manera:

@Provides public ChatServicePerformanceMonitor getChatServicePerfMon() { return new ChatServicePerformanceMonitor(); }

entonces su nivel de clase @Singleton no tendrá efecto porque Guice no está creando el objeto, usted sí. Guice solo puede imponer el alcance a los objetos que crea. No hay nada de malo en agregar @Singleton a tu método getChatServicePerfMon() .

Si tiene un constructor sin argumentos (o un constructor @Inject ) en la clase ChatServicePerformanceMonitor y elimina su método @Provides , las llamadas continuas al inyector devolverán el mismo singleton.


Siempre se puede hacer el enfoque simple:

private ChatServicePerformanceMonitor perfMon = null; @Provides public ChatServicePerformanceMonitor getChatServicePerfMon() { if (perfMon == null) { perfMon = new ChatServicePerformanceMonitor(); } return perfMon; }