Ich habe mehr über das Inversion-of-Control-Prinzip und Dependency-Injection als dessen Implementierung gelesen und bin mir ziemlich sicher, dass ich es verstehe.
Es scheint im Grunde genommen zu heißen, dass Sie Ihre Klassenmitglieder nicht als Instanziierungen innerhalb der Klasse deklarieren. Vielmehr sollten die Instantiierungen über den Konstruktor übergeben und zugewiesen werden. "injiziert" in die Klasse von einer externen Quelle.
Wenn es so einfach ist, wie es scheint, warum brauchen wir Frameworks wie spring oder guice, die dies mit Anmerkungen implementieren? Fehlt mir hier etwas Grundsätzliches? Ich habe wirklich Probleme zu verstehen, was die Verwendung von Dependency Injection-Frameworks ist.
Bearbeiten: Über das mögliche Duplikat, ich glaube, meine Frage ist einzigartiger, da es sich um DI-Frameworks im Allgemeinen handelt, nicht nur um Spring. Spring ist nicht nur ein DI-Framework, daher gibt es viele Gründe, warum jemand Spring verwenden möchte, der nicht mit DI verwandt ist.
Antworten:
Wir brauchen keine Frameworks. Es ist durchaus möglich, die Abhängigkeitsinjektion auch für ein relativ großes Projekt manuell zu implementieren.
Auf der anderen Seite erleichtert die Verwendung eines Frameworks, insbesondere von Annotationen oder der automatischen Erkennung von Abhängigkeiten, den Prozess: Wenn ich entscheide, dass ich eine neue Abhängigkeit in einer Klasse benötige, muss ich nur noch etwas hinzufügen es an den Konstruktor (oder deklarieren Sie einen Setter) und das Objekt wird injiziert - ich muss keinen Instanziierungscode ändern.
Frameworks enthalten häufig auch andere nützliche Funktionen. Spring enthält zum Beispiel ein nützliches Framework für die aspektorientierte Programmierung, einschließlich der deklarativen Transaktionsabgrenzung (was äußerst praktisch ist) und einer Vielzahl von Adapterimplementierungen, die die Integration vieler Bibliotheken von Drittanbietern erleichtern.
quelle
Warum brauchen wir überhaupt DI (Dependency Injection)?
Der DI-Mechanismus trennt die Objektproduktion vom Objektverbrauch. Die Abhängigkeiten, die ein Objekt benötigt, werden von außen transparent geliefert. Der Vorteil des Mechanismus liegt auf der Hand: Sie können Abhängigkeiten jederzeit austauschen, z. B. mit einem Null-Objekt zu Testzwecken.
Wie wird es gemacht?
Es gibt mehrere Möglichkeiten, um das Ziel zu erreichen:
Benötigen wir DI-Frameworks?
Nein überhaupt nicht. Sie können einfach alle Instanzen manuell an andere Objekte übergeben. Wenn Sie eine kleine Anwendung haben, ist kein Federbehälter erforderlich.
Auf der anderen Seite helfen Ihnen Frameworks beim Verwalten von Objekten:
Sie helfen Ihnen bei der Verkabelung komplexer Objektbeziehungen. Sie müssen keinen Boilerplate-Code schreiben, um Instanzen zu generieren und an die entsprechenden Objekte zu übergeben
Sie helfen Ihnen bei der Kontrolle, wann ein Objekt erstellt wird: Sie können Instanzen während des Bootstrappens von Anwendungen erstellen, aber in einigen Fällen ist eine verzögerte Erstellung - nur bei Bedarf - besser
Sie helfen Ihnen dabei zu steuern, wie viele Instanzen erstellt werden: eine pro Anwendungslebensdauer oder eine pro Anforderung (falls Sie eine Webprogrammierung durchführen).
Wenn Ihr Projekt eine angemessene Größe hat - wenn Sie das Gefühl haben, weniger Code für Boilerplates schreiben zu müssen - ist es absolut sinnvoll, ein (DI-) Framework zu verwenden. Es gibt mehr Vor- als Nachteile.
quelle
Mit Frühling ist es meistens eine Frage der Bequemlichkeit.
Wenn Sie Klasse haben ,
TopLevel
die sind Konstrukte Klasse ,MiddleLevel
die Klasse konstruiertLowLevel
, und Sie erkennen , benötigen Sie einen neuen Konstruktor Parameter aufLowLevel
, man muss auch hinzufügen , um es zuTopLevel
, undMiddleLevel
, einfach so , dass , wenn es Zeit fürMiddleLevel
einen konstruieren , umLowLevel
den Wert zur Verfügung steht damit es an seinen Konstruktor übergeben werden kann. Mit spring fügen Sie einfach eine Anmerkung hinzu.Mit spring ist es auch möglich, die Abhängigkeiten in einer externen Konfigurationsdatei anstelle von xml zu definieren, und dies gibt Ihnen angeblich die Möglichkeit, ein neues System mit einer völlig anderen Verkabelung zu generieren, "ohne Code zu ändern". (IMHO ist dies völlig fehlgeleitet, weil das Ändern von XML nicht viel anders ist als das Ändern von Code, und tatsächlich hat Code normalerweise eine weitaus bessere Fehlerprüfung und Typprüfung als XML.)
Eine andere Sache ist, dass viele Leute Angst vor Konstrukteuren haben; sie verstehen sie nicht, sie mögen sie nicht, sie wollen sie lieber nicht benutzen.
quelle
MiddleLevel
, sondern beim KonstruierenTopLevel
als Argument an den Konstruktor erhalten. EbensoMiddleLevel
sollte einLowLevel
in seinem Konstruktor erhalten.Vor ein paar Jahren schrieb ich ein Programm zur Überwachung von Webseiten, Web-Portlets und sogar bestimmten Datenbanktabellen in einem Unternehmen, für das ich früher gearbeitet habe. Ich wollte, dass es flexibel genug ist, damit der Benutzer festlegen kann, welche Monitore mit welchen Parametern (URLs, Anmeldungen, Erfolgskriterien usw.) ausgeführt werden. Also habe ich es geschrieben, um aus einer XML-Datei zu lesen und Java Reflection zu verwenden, um die angegebenen Klassen zu instanziieren und Setter-Methoden zu verwenden, um die angegebenen Parameter festzulegen.
Später fand ich heraus, dass der Frühling dasselbe für Sie tun wird und noch viel mehr.
In meinem Fall habe ich das gefunden
Die Verwendung eines Frameworks zur Abhängigkeitsinjektion macht das Programm flexibler und erleichtert die Angabe der Funktionsweise (natürlich innerhalb genau definierter Parameter).
Durch die Verwendung eines DI-Frameworks von Drittanbietern müssen Sie das Rad nicht neu erfinden.
quelle