Google Guice - Übersicht
Guice ist ein Open Source-Framework für die Java-basierte Abhängigkeitsinjektion. Es ist leicht und wird von Google entwickelt und verwaltet. Dieses Kapitel gibt Ihnen einen Überblick über das Guice-Framework.
Abhängigkeitsspritze
Jede Java-basierte Anwendung verfügt über einige Objekte, die zusammenarbeiten, um das darzustellen, was der Endbenutzer als funktionierende Anwendung ansieht. Beim Schreiben einer komplexen Java-Anwendung sollten Anwendungsklassen so unabhängig wie möglich von anderen Java-Klassen sein, um die Möglichkeit zu erhöhen, diese Klassen wiederzuverwenden und sie beim Komponententest unabhängig von anderen Klassen zu testen. Die Abhängigkeitsinjektion (oder manchmal auch als Verkabelung bezeichnet) hilft dabei, diese Klassen zusammenzukleben und gleichzeitig unabhängig zu halten.
Angenommen, Sie haben eine Anwendung mit einer Texteditor-Komponente und möchten eine Rechtschreibprüfung durchführen. Ihr Standardcode würde ungefähr so aussehen -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Beachten Sie, dass wir hier eine Abhängigkeit zwischen dem TextEditor und dem SpellChecker erstellt haben. In einer Umkehrung des Kontrollszenarios würden wir stattdessen so etwas tun -
public class TextEditor {
private SpellChecker spellChecker;
@Inject
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Hier sollte sich der TextEditor keine Gedanken über die Implementierung von SpellChecker machen. Der SpellChecker wird unabhängig implementiert und dem TextEditor zum Zeitpunkt der TextEditor-Instanziierung zur Verfügung gestellt.
Abhängigkeitsinjektion mit Guice (Bindung)
Die Abhängigkeitsinjektion wird durch die Guice-Bindungen gesteuert. Guice verwendet Bindungen, um Objekttypen ihren tatsächlichen Implementierungen zuzuordnen. Diese Bindungen sind als Modul definiert. Ein Modul ist eine Sammlung von Bindungen wie unten gezeigt -
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);
}
}
Ein Injektor ist der Objektgraph-Builder und ein Modul ist sein Kernbaustein. Daher besteht der erste Schritt darin, einen Injektor zu erstellen und dann den Injektor zu verwenden, um die Objekte zu erhalten.
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);
}
Im obigen Beispiel wird das Objektdiagramm der TextEditor-Klasse von Guice erstellt. Dieses Diagramm enthält das TextEditor-Objekt und seine Abhängigkeit als WinWordSpellChecker-Objekt.