Google Guice - Présentation
Guice est un framework d'injection de dépendances open source basé sur Java. Il est léger et est développé et géré par Google. Ce chapitre vous donnera un aperçu du framework Guice.
Injection de dépendance
Chaque application Java possède quelques objets qui fonctionnent ensemble pour présenter ce que l'utilisateur final considère comme une application fonctionnelle. Lors de l'écriture d'une application Java complexe, les classes d'application doivent être aussi indépendantes que possible des autres classes Java pour augmenter la possibilité de réutiliser ces classes et de les tester indépendamment des autres classes lors des tests unitaires. L'injection de dépendance (ou parfois appelée câblage) aide à coller ces classes ensemble et en même temps à les maintenir indépendantes.
Considérez que vous avez une application qui a un composant éditeur de texte et que vous souhaitez fournir une vérification orthographique. Votre code standard ressemblerait à ceci -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Notez qu'ici nous avons créé une dépendance entre TextEditor et SpellChecker. Dans un scénario d'inversion de contrôle, nous ferions plutôt quelque chose comme ceci -
public class TextEditor {
private SpellChecker spellChecker;
@Inject
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Ici, TextEditor ne devrait pas s'inquiéter de l'implémentation de SpellChecker. Le SpellChecker sera implémenté indépendamment et sera fourni à TextEditor au moment de l'instanciation de TextEditor.
Injection de dépendances à l'aide de Guice (liaison)
L'injection de dépendances est contrôlée par les liaisons de guice. Guice utilise des liaisons pour mapper les types d'objets à leurs implémentations réelles. Ces liaisons sont définies dans un module. Un module est une collection de liaisons comme indiqué ci-dessous -
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 injecteur est le générateur de graphe d'objets et un module est son bloc de construction principal. Ainsi, la première étape consiste à créer un injecteur puis à utiliser l'injecteur pour récupérer les objets.
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);
}
Dans l'exemple ci-dessus, le graphe d'objet de classe TextEditor est construit par Guice et ce graphe contient l'objet TextEditor et sa dépendance en tant qu'objet WinWordSpellChecker.