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;
}