2013-02-12 12 views
7

Sono in procinto di apprendere Guice e non capisco chiaramente come utilizzare l'istanza Injector. È meglio creare l'istanza Injector una volta sul bootstrap dell'applicazione e renderla pubblica singleton?Come usare l'iniettore di Guice?

Ed è vero che dobbiamo sempre utilizzare Injector#getInstance(SomeClass.class) per ottenere le classi in cui sono state annotate le annotazioni @Inject di Guice?

+0

È meglio non usare affatto 'Injector.getInstance()'. – millimoose

+2

@millimoose ma quali sono gli altri modi per recuperare le classi gestite da Guice? – MyTitle

+0

I campi annotati con '@ Inject' dovrebbero avere le classi giuste disponibili" automagicamente ". (Supponendo che Guice gestisca anche le classi che necessitano l'iniezione). L'idea è che il contenitore gestisca entrambe le dipendenze, ** e ** le classi che le usano, e preleva manualmente una classe "principale" dall'iniettore per avviare la tua app. Dovresti anche prendere in considerazione [rileggendo il tutorial] (https://code.google.com/p/google-guice/wiki/GettingStarted), questo è Dipendenza Iniezione 101. – millimoose

risposta

7

Non si dovrebbe passare l'iniettore in giro come un singleton globale. Hai guardato: https://github.com/google/guice/wiki/GettingStarted? Si noti che RealBillingService non utilizza l'iniettore per ottenere istanze di CreditCardProcessor e TransactionLog. Guice invece gestisce tutto questo per te quando crea l'istanza.

Se si è in una situazione in cui è necessario Guice per creare molti oggetti dello stesso tipo, prendere in considerazione l'utilizzo di un Provider e l'iniezione di quel provider.

+0

Sì, lo capisco. Ma cosa succede se ho più servizi come 'RealBillingService', e ognuno di loro ha annotazioni' @ Inject' per iniettare oggetti 'CreditCardProcessor' e' TransactionLog'. Quindi ho bisogno di usare 'Injector # getInstance' per ogni servizio come' RealBillingService'. Ma voglio creare questi servizi in posti diversi, quindi ho 2 varianti: creare l'oggetto 'Injector' in ogni posto e usare' Injector # getInstance' per recuperare il servizio necessario _or_ per creare l'istanza di 'Injector' una volta renderla accessibile (global singleton) a tutti i luoghi in cui ne ho bisogno. – MyTitle

+0

Oppure un terzo oggetto con istanze dei due servizi (entrambi annotati con '@ Inject'). Quindi useresti il ​​'Injector' per ottenere la singola istanza di questo terzo oggetto. – condit

+0

In pratica raramente si vede l '"iniettore". Se stai usando 'Jersey' con' Guice', ad esempio, configuri i tuoi Moduli e poi il framework gestisce il resto. – condit