Feder - Abhängigkeitsinjektion
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();
}
}
Wir haben hier eine Abhängigkeit zwischen dem TextEditor und dem SpellChecker erstellt. In einer Umkehrung des Kontrollszenarios würden wir stattdessen so etwas tun -
public class TextEditor {
private SpellChecker spellChecker;
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. Dieser gesamte Vorgang wird vom Spring Framework gesteuert.
Hier haben wir die vollständige Kontrolle aus dem TextEditor entfernt und an einem anderen Ort (z. B. XML-Konfigurationsdatei) aufbewahrt, und die Abhängigkeit (dh die Klasse SpellChecker) wird über a in die Klasse TextEditor eingefügt Class Constructor. Daher wurde der Kontrollfluss durch Dependency Injection (DI) "invertiert", da Sie Abhängigkeiten effektiv an ein externes System delegiert haben.
Die zweite Methode zum Injizieren von Abhängigkeit ist durch Setter Methodsder TextEditor-Klasse, in der eine SpellChecker-Instanz erstellt wird. Diese Instanz wird verwendet, um Setter-Methoden aufzurufen, um die Eigenschaften von TextEditor zu initialisieren.
Daher gibt es DI in zwei Hauptvarianten, und die folgenden beiden Unterkapitel werden beide mit Beispielen behandeln -
Sr.Nr. | Art und Beschreibung der Abhängigkeitsinjektion |
---|---|
1 | Konstruktorbasierte Abhängigkeitsinjektion Konstruktorbasiertes DI wird erreicht, wenn der Container einen Klassenkonstruktor mit einer Reihe von Argumenten aufruft, die jeweils eine Abhängigkeit von der anderen Klasse darstellen. |
2 | Setter-basierte Abhängigkeitsinjektion Setter-basierte DI wird durch den Container erreicht, der Setter-Methoden für Ihre Beans aufruft, nachdem ein Konstruktor ohne Argumente oder eine statische Factory-Methode ohne Argumente aufgerufen wurde, um Ihre Bean zu instanziieren. |
Sie können sowohl Konstruktor-basierte als auch Setter-basierte DI mischen. Es ist jedoch eine gute Faustregel, Konstruktorargumente für obligatorische Abhängigkeiten und Setter für optionale Abhängigkeiten zu verwenden.
Der Code ist mit dem DI-Prinzip sauberer und die Entkopplung ist effektiver, wenn Objekte mit ihren Abhängigkeiten versehen werden. Das Objekt sucht nicht nach seinen Abhängigkeiten und kennt weder den Ort noch die Klasse der Abhängigkeiten, sondern alles wird vom Spring Framework erledigt.