2013-04-11 7 views
15

Ho un metodo fornitore in un modulo annotato con @Provides:Guice: come configurare un @Provides e @Singleton in un modulo in questo caso?

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

e ho annotato il mio ChatServicePerformanceMonitor con @Singleton. Nel mio codice, dove uso questa istanza, non posso fare a meno di iniettarla "passivamente", a causa di un framework che sto usando che sta costruendo la classe di inclusione (non usa Guice, quindi questo è l'unico modo che conosco di per ottenere il riferimento):

chatServicePerfMon = injector.getInstance(ChatServicePerformanceMonitor.class); 

sembra Guice non rispetta l'annotazione @Singleton sulla mia classe ChatServicePerformanceMonitor. Ricevo un'istanza per ogni chiamata a injector.getInstance (ChatServicePerformanceMonitor.class).

Aggiunta del @Singleton al metodo fornitore sembra per risolvere questo problema:

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

è che il comportamento previsto? Sembra che @Singleton sull'istanza sia tutto ciò di cui ho bisogno.

+2

Come stai creando il 'ChatServicePerformanceMonitor' nel tuo primo snippet di codice? Se Guice non lo sta creando nel tuo metodo 'getChatServicePerfMon', il' @ Singleton' verrà ignorato. – condit

+1

Sì, è costruito all'interno del metodo @Provider, quasi esattamente come descritto [qui] (https://code.google.com/p/google-guice/wiki/ProvidesMethods) nel metodo provideTransactionLog. Sembra che debba essere qualcosa che sto facendo, come qualcun altro deve aver avuto questo problema. Ma non riesco a vedere nulla che non sia molto diverso dai loro esempi, a parte il fatto che ottengo l'istanza direttamente da un iniettore. –

risposta

17

Se si sta creando il ChatServicePerformanceMonitor in questo modo:

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

allora il tuo livello di classe @Singleton annotazione avrà alcun effetto perché Guice non sta creando l'oggetto, sei. Guice può solo applicare l'ambito sugli oggetti che crea. Non c'è niente di sbagliato nell'aggiungere @Singleton al tuo metodo getChatServicePerfMon().

Se si dispone di un costruttore senza argomenti (o un costruttore @Inject) sulla classe ChatServicePerformanceMonitor e si rimuove il metodo @Provides poi chiamate continue all'iniettore restituiranno lo stesso Singleton.

+1

Ok, grazie. Sto facendo un nuovo in là. Credo che poiché Guice sta chiamando il metodo del mio provider, ho pensato che avrebbe comunque rafforzato il comportamento di Singleton (dal momento che non chiamo il metodo del provider, lo fanno) e potrei gestirlo. Suppongo di aver sbagliato! –

+0

Non conosco il framework che si sta utilizzando, ma si può anche usare Guice per creare l'istanza allegata (anche se non si può iniettare in esso) tramite un 'Provider' (o' @ Provides'). In questo modo quell'oggetto può collaborare con altre dipendenze di Guice. – condit

+0

Grazie, sì, ho cercato un modo per farlo per un po ', ma il modo in cui questo framework "funziona" è estendere una delle loro classi. Eseguono il bootstrap di tutto quando si avviano (è un server di gioco chiamato SmartFox) e eseguono l'istanza della classe di estensione. Non penso che ci sia un modo per farla intercettare da Guice, vero? –

Problemi correlati