Spring-Kontext als Laufzeitabhängigkeit

8

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"?

    
user2418306 25.02.2016, 14:13
quelle

5 Antworten

4

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.

    
heisbrandon 09.03.2016, 20:43
quelle
3

1

Zunächst wollen wir über DI sprechen.

Hinweis von Spring Doc ,

  

Dependency Management und Dependency Injection sind verschiedene Dinge.

  • Dependency Management ist "assemblieren Sie alle benötigten Bibliotheken (JAR-Dateien) und holen Sie sie zur Laufzeit und möglicherweise zur Kompilierzeit in Ihren Klassenpfad".
  • Dependency injection ist, wenn Sie ein 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.

%Vor%

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

hinzu %Vor%

Definieren Sie eine Bean Login mit dem Namen springManagedLoginAction in applicationContext.xml

%Vor%

Verwenden Sie diese Bean in der Action-Klasse in struts-config-login.xml

%Vor%     
Max 09.03.2016 20:29
quelle
0

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.

    
Jakub Balhar 10.03.2016 07:52
quelle
-1

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) Ссылка

    
ivanenok 08.03.2016 05:42
quelle
-1

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 .

    
Ervis Zyka 09.03.2016 17:43
quelle

Tags und Links