Abhängigkeitsinjektion Einführung
Lassen Sie uns zunächst das Konzept der Abhängigkeitsinjektion überprüfen:
Abhängigkeitsinjektion und Kontrollinversion, die wir häufig erwähnen, sind das gleiche Konzept. Die spezifische Bedeutung lautet: Wenn eine Rolle (möglicherweise eine Java -Instanz, Anrufer) die Unterstützung einer anderen Rolle (eine andere Java -Instanz, Anrufer) benötigt, wird der Anrufer normalerweise vom Anrufer erstellt. Aber im Frühjahr wird die Arbeit des Erstellens der Callee nicht mehr vom Anrufer erledigt, so dass sie als Kontrollinversion bezeichnet wird. Die Arbeit der Erstellung der Callee -Instanz wird normalerweise vom Federbehälter erledigt und dann in den Anrufer injiziert, sodass sie auch als Abhängigkeitsinjektion bezeichnet wird.
Tatsächlich besteht die Rolle der Abhängigkeitsinjektion einfach darin, die Abhängigkeiten zwischen Objekten aus dem ursprünglichen Code zu entkoppeln und die Verarbeitung von Spring Framework hinzuzufügen, damit wir Abhängigkeiten flexibel und zentral verwalten können.
Abhängigkeitsinjektionsrahmen
Abhängigkeitsinjektionsrahmen ist nicht mysteriös, es ist eigentlich eine sehr einfache Sache. Schauen Sie sich den Quellcode für Abhängigkeitseinspritzeinheiten des Frühlings nicht an, denn solange Sie gehen, werden Sie nie wieder schreiben und Sie werden es nicht wagen, alleine zu beginnen. Seine Funktion ist zu leistungsfähig, daher ist das Design zu kompliziert. Gewöhnliche Programmierer können nur auf den Anblick seufzen.
Ich habe den Frühlingsquellcode nicht sorgfältig gelesen. Trotzdem dauerte es nur einen halben Tag, um ein kleines Gerüst anzuwenden. Dieses kleine Framework hat nur einen Hauptklasseninjektor mit etwa 200 Codezeilen und die folgenden Funktionen.
Schauen wir uns ein etwas komplizierteres Beispiel für die Nutzung an
import javax.inject.inject; import javax.inject.named; import javax.inject.singleton; importieren iockids.injector; @singletonClass root {@inject @named ("a") Knoten A; @Inject @Named ("B") Knoten B; @Override public String toString () {return string.format ("root ( %s, %s)", A.Name (), B.Name ()); }} Schnittstellenknoten {String name ();}@Singleton@named ("a") class nodea implementiert node {@inject leaf; @Inject @Named ("B") Knoten B; @Override public String name () {if (b == null) return string.format ("nodea (%s)", Leaf); sonst return string.format ("nodeawithb (%s)", Leaf); }}@Singleton@named ("b") Klasse NodeB implementiert Knoten {Leaf Leaf; @Inject @Named ("a") Knoten A; @Inject public nodeB (Blattblatt) {this.leaf = leaf; } @Override public String name () {if (a == null) return string.format ("nodeB (%s)", Leaf); sonst return string.format ("nodeBwitha (%s)", Leaf); }} class Leaf {@inject root; int Index; statische Int -Sequenz; public Leaf () {index = sequence ++; } public String toString () {if (root == null) return "Leaf" + index; sonst geben Sie "Leafwitroot" + Index zurück; }} öffentliche Klasse Demo {public static void main (String [] args) {var Injector = new Injector (); Injector.registerqualifiedClass (Node.class, nodea.class); Injector.registerQualifiedClass (Node.class, NodeB.Class); var root = injector.getInstance (root.class); System.out.println (root); }}Der obige Code verwendet alle von Iockids bereitgestellten Funktionen.
Um das Verständnis des obigen Code zu erleichtern, habe ich ein Abhängigkeitsdiagramm gezeichnet
Die obige Codeausgabe ist wie folgt
root (nodeawithb (LeafWitHroot0), NodeBwitha (Leafwitroot1))
Aus dieser Ausgabe können wir uns auch grob die Abhängigkeitsstruktur vorstellen.
Iockids enthält Ausnahmeberichte für reichhaltige Injektionsfehler, um Konfigurationsfehler der Benutzereinspritzung zu verhindern.
Wenn wir beispielsweise die Namen von Nodea und NodeB auf demselben A konfigurieren, wird der folgende Fehlerstapel freigelegt.
iockids.injectException: duplizierte qualifizierte javax.inject.named mit derselben Klasse iockids.demo.node at iockids.injector.registerqualifiedClass (Injector.java:87) bei iockids.injector.registerqualifiedClass (Injector.java:70) bei ATRECTOR. iockids.demo.demo.main (Demo.java:106)
Wenn wir dem Konstruktor von NodeB nach Belieben einen Parameter hinzufügen
@Inject public nodeB (Blattblatt, int k) {this.leaf = leaf; }Der folgende Fehler wird beim Laufen geworfen
Iockids.injectException: Kein zugänglicher Konstruktor für die Injektionsklasse in iockids.injector.createNew (Injector.java:120) bei iockids.injector.createNew (Injector.java:94) bei iockids.injector.createfromparameter (injector.java:167) in iockids.injector.createfromconstructor (Injector.java:145) bei iockids.injector.createw (INJECTOR.JAVA:123) bei iockids.injector.createfromqualified (Injector.java:216). Iockids.injector.injectMembers (Injector.java:233) bei iockids.injector.createNew (Injector.java:136) in iockids.injector.createfromqualified (Injava:216) in iockids.injector.createField (Injava:216) in iockids.injector.createField (Injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in (injava:173) in der iockids.injector.injectMembers (Injector.java:233) in iockids.injector.createNew (Injector.java:136) bei iockids.injector.createNew (Injector.java:94) in iockids.injectinstance (injava.java iockids.demo.demo.main (Demo.java:107)
Projekt Open Source -Adresse: https://github.com/pyloque/iockids (lokaler Download)
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.