Google Guice - Visão geral

Guice é uma estrutura de injeção de dependência baseada em Java e de código aberto. É leve e é desenvolvido e gerenciado pelo Google. Este capítulo lhe dará uma visão geral do framework Guice.

Injeção de dependência

Cada aplicativo baseado em Java possui alguns objetos que funcionam juntos para apresentar o que o usuário final vê como um aplicativo funcional. Ao escrever um aplicativo Java complexo, as classes do aplicativo devem ser o mais independentes possível de outras classes Java para aumentar a possibilidade de reutilizar essas classes e testá-las independentemente de outras classes durante o teste de unidade. A injeção de dependência (ou às vezes chamada de fiação) ajuda a unir essas classes e, ao mesmo tempo, mantê-las independentes.

Considere que você tem um aplicativo que possui um componente de editor de texto e deseja fornecer uma verificação ortográfica. Seu código padrão seria mais ou menos assim -

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

Observe que aqui criamos uma dependência entre o TextEditor e o SpellChecker. Em um cenário de inversão de controle, em vez disso, faríamos algo assim -

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

Aqui, o TextEditor não deve se preocupar com a implementação do SpellChecker. O SpellChecker será implementado de forma independente e fornecido ao TextEditor no momento da instanciação do TextEditor.

Injeção de dependência usando Guice (ligação)

A injeção de dependência é controlada pelo Guice Bindings. Guice usa ligações para mapear os tipos de objetos para suas implementações reais. Essas ligações são definidas como um módulo. Um módulo é uma coleção de ligações conforme mostrado abaixo -

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

Um injetor é o construtor de gráfico de objeto e um Módulo é seu bloco de construção principal. Assim, o primeiro passo é criar um injetor e então usar o injetor para pegar os objetos.

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

No exemplo acima, o gráfico do objeto da classe TextEditor é construído pelo Guice e este gráfico contém o objeto TextEditor e sua dependência como objeto WinWordSpellChecker.