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.