Ich bin verwirrt von diesen Abschnitt der Frühjahrsdokumentation.
Um beispielsweise einen Anwendungskontext zu erstellen und die Abhängigkeitsinjektion zum Konfigurieren einer Anwendung zu verwenden, sehen Ihre Maven-Abhängigkeiten folgendermaßen aus:
%Vor%Beachten Sie, dass der Bereich als Laufzeit deklariert werden kann, wenn Sie nicht mit Spring-APIs kompilieren müssen, was normalerweise bei grundlegenden Anwendungsfällen für die Abhängigkeitsinjektion der Fall ist.
Ich kenne JSR 330 (DI-Annotationen). Aber wie entkoppeln Sie von ApplicationContext
class? Und wenn Sie davon entkoppeln, warum dann immer noch auf den Frühling angewiesen?
Wie kann zum Beispiel Schnellstart mit spring-context
als Laufzeitabhängigkeit umgeschrieben werden? ? Oder was wäre der "Anwendungsfall der grundlegenden Abhängigkeitsinjektion"?
Ich denke, der "grundlegende Anwendungsfall" bezieht sich auf XML-basierte Anwendungskontexte. In dieser Dokumentation heißt es, wenn Sie Spring-Bibliotheken nicht direkt in Ihrem Code verwenden, müssen Sie diese Bibliotheken nicht in Ihren Kompilierungsklassenpfad aufnehmen. Dies ist bei XML-Konfigurationen der Fall, da alles im Zusammenhang mit Spring in XML konfiguriert ist und daher nicht kompiliert wird.
Im Schnellstart, den Sie verlinkt haben, verwendet der Autor eine annotierungsbasierte Anwendungskontextkonfiguration, die erfordert, dass die Spring-Bibliotheken sowohl zur Kompilier- als auch zur Laufzeit einbezogen werden.
Beispiel einer XML-Konfiguration: Ссылка
Es sollte nur ein paar wichtige Punkte geben, an denen der Anwendungscode direkt auf den IoC-Container zugreifen muss [...]. Wenn Sie eine Webanwendung entwickeln, müssen Sie möglicherweise nicht direkt auf den IoC-Container zugreifen, da dies automatisch die Instanziierung Ihres Controllers und aller erforderlichen Beans übernimmt.
Ich bin mir nicht ganz damit vertraut, aber es sieht auch so aus, als könnten Sie JSR330 wie von Ihnen vorgeschlagen mit einer XML-Konfiguration verwenden, um Beans mit Annotationen zu initiieren. Siehe hier . Dies würde die Verwendung von Anmerkungen ermöglichen, ohne dass Spring in Kompilierungskonfigurationen eingebunden werden muss.
1
Zunächst wollen wir über DI sprechen.
Hinweis von Spring Doc ,
Dependency Management und Dependency Injection sind verschiedene Dinge.
Service
-Objekt in Ihrer Klasse haben wollen, anstatt es mit service = new Service();
zu erstellen, lassen Sie das Spring-Framework den Lebenszyklus dieser Bean behandeln. Beispiel für die Verwaltung von Abhängigkeiten:
%Vor%Damit Sie alle diese JAR-Dateien in Ihrem Projekt haben.
%Vor%Beispiel für Dependency Injection:
In Ihrem Beispiel Schnellstart injizieren Sie MessageService
in MessagePrinter
mit Konstruktorinjektion. Du hast kein MessageService
irgendwo erstellt. Spring Container erstellt es für Sie.
2
Sprechen wir nun über transitive Abhängigkeit und Laufzeitabhängigkeit .
Transitive Abhängigkeit
Es bedeutet, die Bibliotheken zu entdecken, die Ihre eigenen Abhängigkeiten benötigen, und diese automatisch einzubinden.
Zum Beispiel, wenn Sie die Abhängigkeiten A und B in pom.xml
angegeben haben. Und A hängt von C, D ab. B hängt von E ab. Sie müssen C, D, E in Ihrer Konfiguration nicht einschließen.
Wegen der transitiven Abhängigkeit werden C, D, E automatisch eingefügt.
Laufzeitabhängigkeit
Es ist eine Art von Abhängigkeitsbereichen, um die transitive Abhängigkeit zu begrenzen.
"Dieser Bereich zeigt an, dass die Abhängigkeit nicht benötigt wird Kompilation, ist aber zur Ausführung. Es ist in der Laufzeit und im Test Klassenpfade, aber nicht den Kompilierungsklassenpfad. "
3
Jetzt ist die Frage: Gibt es einen Fall, dass für DI "Sie nicht gegen Spring-APIs kompilieren müssen", stattdessen können Sie den Bereich als Laufzeit festlegen? Ähnliche Frage hier .
Ja, ein Beispiel, an das ich denken kann, ist eine Webanwendung. Angenommen, ich verwende Struts mit Spring-Plugin. (Das folgende Beispiel stammt von "Struts 2 in Action" von Manning)
Ich möchte Spring anweisen, eine Instanz der Klasse Login
zu erstellen, die als Aktionsobjekt für die Anfrage verwendet werden soll.
fügen Sie einen Spring Web Context Listener zu web.xml
Definieren Sie eine Bean Login
mit dem Namen springManagedLoginAction
in
applicationContext.xml
Verwenden Sie diese Bean in der Action-Klasse in struts-config-login.xml
Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstanden habe, aber es scheint mir, dass Sie fragen, warum Sie Spring-Kontext-Abhängigkeit benötigen, wenn Sie JSR-330-Annotationen verwenden.
Nun, die Antwort aus meiner Sicht ist, dass Sie die Abhängigkeit von Spring nicht benötigen, wenn Sie nur JSR-330-Annotationen verwenden, aber damit sie funktionieren, benötigen Sie eine Bibliothek, die sie versteht und korrekt aufbaut das Abhängigkeitsdiagramm für Sie und den Frühlingskontext ist eine solche Bibliothek.
Der Grund dafür, dass es sich um eine Laufzeitabhängigkeit handelt, liegt darin, dass Sie diesen Anbieter zur Laufzeit zumindest theoretisch wechseln können.
Sie können Ihre Beans mit einer Abhängigkeit von javax.inject (@Named, @Inject) in einem separaten Bundle implementieren. Sie können von einem Frühjahrsprojekt oder jedem anderen Container, der über eine eigene DI-Implementierung verfügt, verwendet werden.
Hier ist ein Beispiel für die Überarbeitung federbasierter Komponenten zu javax.inject (ohne das Projekt in verschiedene Bündel zu teilen) Ссылка
Wenn ich richtig verstehe, fragen Sie im Grunde, wie der Dependency Injector initialisiert wird und wie Sie die Abhängigkeiten in Ihre Klassen injizieren können. Im Schnellstartbeispiel haben Sie angegeben, dass der Anwendungskontext manuell in der Hauptklasse angelegt wird.
%Vor%Laut Dokumentation
Eigenständiger Anwendungskontext, der annotierte Klassen als Eingabe akzeptiert - insbesondere @ Konfiguration annotierte Klassen, aber auch einfach @ Komponententypen und JSR-330-konforme Klassen, die javax.inject verwenden Anmerkungen. Ermöglicht das Registrieren von Klassen nacheinander mit Register (Klasse ...) sowie zum Klassenpfad-Scannen mit scannen (String ...)
Eine alternative Möglichkeit, den Frühling zu initialisieren, finden Sie in Ihrer web.xml, wo Sie die ContextLoaderListner , das den Spring-Anwendungskontext für Sie beim Start der Programme bootstrappt.
Die Frage, wie man den Frühling in web.xml startet, wurde bereits beantwortet hier .