Google Guice - Panoramica

Guice è un framework di iniezione delle dipendenze open source basato su Java. È leggero ed è sviluppato e gestito da Google. Questo capitolo ti darà una panoramica del framework Guice.

Iniezione di dipendenza

Ogni applicazione basata su Java ha alcuni oggetti che lavorano insieme per presentare ciò che l'utente finale vede come un'applicazione funzionante. Quando si scrive un'applicazione Java complessa, le classi dell'applicazione dovrebbero essere il più indipendenti possibile da altre classi Java per aumentare la possibilità di riutilizzare queste classi e per testarle indipendentemente da altre classi durante il test unitario. Dependency Injection (o talvolta chiamato cablaggio) aiuta a incollare queste classi insieme e allo stesso tempo a mantenerle indipendenti.

Considera di avere un'applicazione che ha un componente di editor di testo e di voler fornire un controllo ortografico. Il tuo codice standard sarebbe simile a questo -

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

Nota che qui abbiamo creato una dipendenza tra TextEditor e SpellChecker. In uno scenario di inversione del controllo, faremmo invece qualcosa del genere:

public class TextEditor {
   private SpellChecker spellChecker;
   
   @Inject
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

Qui, TextEditor non dovrebbe preoccuparsi dell'implementazione del correttore ortografico. Il correttore ortografico verrà implementato in modo indipendente e verrà fornito a TextEditor al momento della creazione di istanze di TextEditor.

Inserimento di dipendenze tramite Guice (associazione)

Dependency Injection è controllata dai Guice Bindings. Guice utilizza i collegamenti per mappare i tipi di oggetto alle loro implementazioni effettive. Queste associazioni sono definite un modulo. Un modulo è una raccolta di associazioni come mostrato di seguito:

public class TextEditorModule extends AbstractModule {
   @Override 
   protected void configure() {
      /*
         * Bind SpellChecker binding to WinWordSpellChecker implementation 
         * whenever spellChecker dependency is used.
      */
      bind(SpellChecker.class).to(WinWordSpellChecker.class);
   }
}

Un iniettore è il costruttore del grafico a oggetti e un modulo è il suo blocco di base. Pertanto, il primo passo è creare un iniettore e quindi utilizzare l'iniettore per ottenere gli oggetti.

public static void main(String[] args) {
   /*
      * Guice.createInjector() takes Modules, and returns a new Injector
      * instance. This method is to be called once during application startup.
   */
   
   Injector injector = Guice.createInjector(new TextEditorModule());
   /*
      * Build object using injector
   */
   TextEditor textEditor = injector.getInstance(TextEditor.class);   
}

Nell'esempio precedente, il grafico dell'oggetto della classe TextEditor è costruito da Guice e questo grafico contiene l'oggetto TextEditor e la sua dipendenza come oggetto WinWordSpellChecker.