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.
-
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-config
Attribut auf<context:component-scan>
... -
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?
Antworten:
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.
quelle
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).
quelle
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
@Autowire
und 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
@Component
in meinem Projekt keinen Bibliothekscode. Sie wissen nie, wann / wie Sie eine Bohne verwenden müssen, und wenn Sie@Component
dies 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
quelle
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).
quelle