Was ist der Unterschied zwischen <mvc: annotation-powered /> und <context: annotation-config /> im Servlet?

155

Ich migriere von Spring 2.5 zu Spring 3.

Sie haben eingeführt, <mvc:annotation-driven />was etwas schwarze Magie bewirkt. Dies wird voraussichtlich nur in der Servlet-Konfigurationsdatei deklariert.

In Spring 2.5 habe ich soeben sowohl Tags als auch Dispatcher-Servlet-Konfigurations-XML mit geeigneten Basispaketen zum Scannen verwendet <context:annotation-config />und <context:component-scan base='...'/>deklariert application-context.xml.

Ich frage mich also, was der Unterschied zwischen mvc:annotation-drivenund context:annotation-configTags in der Servlet-Konfiguration ist und was ich in Spring 3-Konfigurationsdateien beseitigen kann.

glaz666
quelle

Antworten:

150

<context:annotation-config>erklärt Unterstützung für allgemeine Anmerkungen wie @Required, @Autowired, @PostConstruct, und so weiter.

<mvc:annotation-driven />erklärt explizite Unterstützung für annotationsgesteuerte MVC-Controller (dh @RequestMapping, @Controllerobwohl die Unterstützung für diese das Standardverhalten ist) sowie Unterstützung für deklarative Validierung über @Validund Message Body Marshalling mit @RequestBody/ ResponseBody.

Skaffman
quelle
3
sollte ich context: annotation-config sowohl in applicationContext als auch im Servlet deklarieren, insbesondere wenn ich im Component-Scan-Tag unterschiedliche Basispakete verwende?
Glaz666
2
Ja, Sie benötigen <context:annotation-config>in jedem Kontext.
Skaffman
61
@skaffman: <mvc:annotation-driven>ist nicht sinnlos, es ist nur falsch benannt. Tatsächlich konfiguriert es die Unterstützung für neue Spring MVC-Funktionen wie deklarative Validierung mit @Valid, HTTP-Nachrichtenkonvertierung mit @RequestBody/ @ResponseBody, neue
Feldkonvertierungsarchitektur
5
@Richards: Normalerweise ja, siehe blog.springsource.com/2009/12/21/…
axtavt
7
Diese Antwort ist eindeutig falsch, da mvc: annotationsgesteuert für Konvertierungen und Validierungen von entscheidender Bedeutung ist. Das einzig Richtige und Wertvolle hier ist der Kommentar von @axtavt.
Konrad Garus
36

Es gibt auch einige weitere Details zur Verwendung <mvc:annotation-driven />in den Spring-Dokumenten . Kurz gesagt, <mvc:annotation-driven />bietet Ihnen eine bessere Kontrolle über das Innenleben von Spring MVC. Sie müssen es nur verwenden, wenn Sie eine oder mehrere der im oben genannten Abschnitt der Dokumentation beschriebenen Funktionen benötigen.

Es stehen auch andere "annotationsgesteuerte" Tags zur Verfügung, um zusätzliche Funktionen in anderen Spring-Modulen bereitzustellen. <transaction:annotation-driven />Ermöglicht beispielsweise die Verwendung der Annotation @Transaction, <task:annotation-driven />die für @Scheduled et al.

Seanhodges
quelle
Ich würde gerne eine Reihe von Einstellungen in XML sehen, die diesem Tag ähnlich sind. Einmal bin ich vor langer Zeit auf dieses Beispiel gestoßen, aber es war unvollständig, AFAIR.
glaz666
7

mvc: annotationsgesteuert ist ein in Spring 3.0 hinzugefügtes Tag, das Folgendes ausführt :

  1. Konfiguriert den Spring 3 Type ConversionService (Alternative zu PropertyEditors)
  2. Fügt Unterstützung für die Formatierung von Zahlenfeldern mit @NumberFormat hinzu
  3. Fügt Unterstützung für die Formatierung von Datums-, Kalender- und Joda-Zeitfeldern mit @DateTimeFormat hinzu, wenn sich die Joda-Zeit im Klassenpfad befindet
  4. Fügt Unterstützung für die Überprüfung von @ Controller-Eingaben mit @Valid hinzu, wenn sich ein JSR-303-Provider im Klassenpfad befindet
  5. Fügt Unterstützung für die Unterstützung beim Lesen und Schreiben von XML hinzu, wenn sich JAXB im Klassenpfad befindet (HTTP-Nachrichtenkonvertierung mit @ RequestBody / @ ResponseBody)
  6. Fügt Unterstützung für das Lesen und Schreiben von JSON hinzu, wenn sich Jackson im Klassenpfad befindet (in der gleichen Richtung wie # 5).

context: annotation-config Sucht nach Annotationen für Beans in demselben Anwendungskontext, in dem sie definiert sind, und erklärt die Unterstützung für alle allgemeinen Annotationen wie @Autowired, @Resource, @Required, @PostConstruct usw. usw.

Praveen Kumar KS
quelle
2
Quelle und weitere Details zu mvc: annotation-driver - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0
Aniket Thakur
Sie wollen also sagen: Wenn ich @Autowired, @Resource, @Required, @PostConstruct UND @RequestBody, @ResponseBody- all diese Anmerkungen benötige, muss ich diese beiden mvc:annotation-driven context:annotation-configTags in meine Konfiguration einfügen?
R Dhaval