Frühling - Verwirrung über Konfiguration?

9

Irgendwo, wo ich gelesen habe, bietet Spring Komfort gegenüber Konfiguration. Aber die Leute von Spring bringen so viele Änderungen an der Konfiguration mit sich, dass ich jetzt wirklich verwirrt bin, die XML-Konfiguration oder die Annotation zu verwenden.

Ich möchte, dass jeder eine todsichere Methode oder Faustregel für die Verwendung von XML und Anmerkungen vorschlägt.


Beispiele bei SO zeigen, dass viele Anfänger wie ich über die Konfiguration verwirrt sind.

  • Link-1

    Ich scheine die Funktionalität hinter <context:annotation-config>und nicht zu verstehen <context:component-scan>.

    Nach dem, was ich gelesen habe, scheinen sie unterschiedliche Anmerkungen zu verarbeiten (@Required, @Autowired usw. vs @Component, @Repository, @Service usw.), aber auch nach dem, was ich gelesen habe, registrieren sie dieselben Bean-Postprozessor-Klassen.

    Um mich noch mehr zu verwirren, gibt es ein annotation-configAttribut auf <context:component-scan>...

  • Link 2

    Ich habe immer noch das Komponenten-Scan-Tag:

    <context:component-scan base-package="com.mycompany.maventestwebapp" />

    aber ich habe auch einen anderen Tag (der aussieht, als hätte er eine ähnliche Aufgabe), diesen:

    <annotation-driven />

    Was ist der Unterschied zwischen diesen beiden Tags? Eine andere "seltsame" Sache ist, dass das vorherige Beispiel (das das annotationsgesteuerte Tag nicht verwendet) dem von STS mithilfe des Spring MVC Template-Projekts erstellten Projekt sehr ähnlich ist, aber wenn ich das annotationsgesteuerte Tag aus seiner Konfiguration lösche Datei das Projekt nicht ausführen und geben Sie mir den folgenden Fehler: HTTP Status 404 - ...

Spring 3.2 benötigt cglib nicht mehr zum Proxying, niedrigere Versionen verwenden jedoch cglib. Ein Zitat aus dem springsource Blog

Um solche Proxys zu generieren, verwendet Spring eine Drittanbieter-Bibliothek namens cglib. Leider ist dieses Projekt nicht mehr aktiv. In Spring 3.2 wird Spring sehr wahrscheinlich standardmäßig Javassist verwenden.

Reichen diese aus, um darauf hinzuweisen, dass Spring Verwirrung über die Konfiguration ist?

Gemeinschaft
quelle
1
"Spring Leute bringen so viele Änderungen in der Konfiguration" - könnten Sie bitte ein Beispiel geben? Das würde den Lesern helfen, Ihr Problem besser zu verstehen und Ihre Frage zu beantworten
Mücke
9
Die Frage ist nicht so gut, aber der Titel ist sicher lustig.
Florian Margaine
1
@gnat Während ich mir den Frühling beibrachte, googelte ich herum und stieß auf dieselben Dinge, die auf viele verschiedene Arten ausgedrückt wurden. Die Frühlingsdokumentation sagt eine Art und Weise, Dinge zu tun, einige Tutorials sagen noch eine andere Art und Weise, beide sind richtig, die Lernkurve ist so hoch. Meine einzige Frage ist ... gibt es eine klare Dokumentation, die alle möglichen Möglichkeiten zeigt, eine einzelne Sache zu tun im Frühling ?
1
@tito Die Frage, wie Sie sie in den Kommentaren angeben, "Gibt es eine Dokumentation", klingt wie eine Ressourcenanforderung. Ressourcenanfragen sind bei Programmierern nicht sehr willkommen . Soweit ich weiß, würde man stattdessen lieber ein zugrunde liegendes Problem präsentieren (soweit ich sehen kann, haben Sie genau das in Frage gestellt, "verwirrt zu werden") - ein Problem, das mit einer bestimmten angeforderten Ressource gelöst werden sollte
Mücke
2
@tito Ich denke, Ihr Problem besteht darin, alte Tutorials mit neuer Dokumentation zu mischen. Der Frühling ist zu einer "Konvention über die Konfiguration" geworden, bei der Sie nicht mehr so ​​viel ausdrücken müssen wie früher. Alte Tutorials (insbesondere vor 3.1) machen jedoch eine Menge Dinge, die jetzt unnötig sind.
Matsemann

Antworten:

5

Spring möchte Ihnen ein Framework bieten, in dem es "Konventionen über Konfigurationen" gibt. Die Realität ist jedoch, dass Spring-Anwendungen eine gewisse Konfiguration benötigen.

In Spring 2.5.x und früheren Versionen bestand die gängige Redewendung darin, diese Konfiguration über XML bereitzustellen. In Spring 3.0+ besteht die idiomatische Möglichkeit darin, Anmerkungen zu verwenden (was auch Java EE6 / 7 fördert).

Nebenbei bemerkt, es kann amüsant (traurig?) Sein, eine mit Anmerkungen versehene JPA-Entität zu sehen. Es ist ziemlich einfach, einem einzelnen Feld mehr als 4 Anmerkungen hinzuzufügen.

Martijn Verburg
quelle
Die Ebene der erforderlichen Konfigurationen ist für einen kleinen Zeitentwickler wie mich, der mit N verschiedenen Frameworks jonglieren muss, um ein Projekt fertigzustellen, weit über den Tellerrand hinausgegangen.
1
Ich habe Methoden mit zehn Anmerkungen, von denen jede eine andere nützliche Sache tut ...
Donal Fellows
1
Andererseits ist es auch möglich, eine JPA-Entität mit einer einzelnen @ Entity-Annotation für die Klasse und sonst nichts zu haben. Wenn das keine Konvention über die Konfiguration ist, weiß ich nicht, was es ist. Wenn Sie das Bedürfnis haben, dass alles genau so funktioniert, wie Sie es möchten, beschweren Sie sich nicht, dass Sie am Ende viel Konfiguration haben - seien Sie froh, dass dies überhaupt möglich ist.
Michael Borgwardt
2
Ich verstehe nicht, warum 4 Annoationen Sie traurig machen. Wie würde die entsprechende XML-Datei aussehen?
NimChimpsky
Oh, das XML wäre viel, viel schlimmer :-)
Martijn Verburg
0
<annotation-driven />

Sie müssen das XML-Schema angeben, von dem dies stammt.

Höchstwahrscheinlich im Kontext der JPA-Transaktionsbehandlungsstrategie beim Definieren des Transaktionsmanagers (siehe 9.5.6. Verwenden von @Transactional in den Spring-Dokumenten)

Wenn Sie eine annotationsgesteuerte Transaktionsbehandlung definieren - Spring AOP erstellt automatisch Aspekte für Ihre Methode, um die Transaktion vor dem Aufrufen einer Methode zu starten (oder auf vorhandene zu prüfen) und nach Beendigung der Methoden-Ivokation festzuschreiben (oder im Falle einer Ausnahme zurückzusetzen).

Zilvinas
quelle
0

Ich habe festgestellt, dass die auf Anmerkungen basierende IoC / Bean-Erstellung praktisch ist, wenn Sie eine Singleton-Implementierung haben, diese aber möglicherweise austauschen müssen.

Im Gegensatz zu einer Situation, in der Sie eine Bean möglicherweise wiederholt mit verschiedenen abhängigen Klassen / Instanzen wiederverwenden müssen.

In diesen Fällen deklariere ich die Bean in config und führe normalerweise eine Konstruktorinjektion der benötigten Abhängigkeit durch. Dann, in der Klasse, in der die Bohne (n) I @Autowireund dann verwendet werden @Qualifier("")- so sollen Fabriken funktionieren.

Ein Singleton ist eine Factory-Methode, die nur 1 Ergebnis zurückgibt. Wenn dies nicht einfach ist, müssen Sie es verwechseln.

Was die Verwendung von Komponenten-Scan im Vergleich zu Nicht-Scan betrifft, so unterliegt dies wirklich den oben genannten Kriterien und einem guten Urteilsvermögen. Ich bin im Allgemeinen sehr explizit über das Scannen von Paketkomponenten. Auf diese Weise kann ich einen anderen Anwendungskontext zum Testen erstellen, in dem ich externe Abhängigkeiten (wie eine Datenbank) verspotten kann, während ich den Rest meines IoC-Setups teste.

Außerdem habe ich @Componentin meinem Projekt keinen Bibliothekscode. Sie wissen nie, wann / wie Sie eine Bohne verwenden müssen, und wenn Sie @Componentdies tun, können Sie sie versehentlich in einem Scan aufnehmen und die Wiederverwendbarkeit einschränken. Für diese Fälle habe ich im Allgemeinen einen Anwendungskontext in der Bibliothek definiert, der einige praktische Standardeinstellungen für die Bean-Deklaration enthält, die mein Hauptprojekt beim Import in den Anwendungskontext enthalten kann.

Keine Religion hier. Nur Erfahrungen zum Weitergeben

Christian Bongiorno
quelle
0

Spring bietet Optionen, ursprünglich gab es nur die XML-basierte Verkabelung. Später wurde eine auf Anmerkungen basierende Verkabelung hinzugefügt.
Es ist jetzt möglich (und viele Menschen tun dies), eine Mischung aus beiden zu verwenden.
Spring enthält zahlreiche Dokumentationen, die von der springsource-Website heruntergeladen werden können. Es gibt professionelles Training (nie gemacht, kann nicht dafür bürgen) und einige gute Bücher (ich mag APress 'Pro Spring, wählen Sie die richtige Version für die Version von Spring, die Sie verwenden).

jwenting
quelle