¿Cuál es la diferencia entre <mvc: annotation-driven /> y <context: annotation-config /> en el servlet?

155

Estoy migrando de Spring 2.5 a Spring 3.

Han introducido <mvc:annotation-driven />que hace un poco de magia negra. Se espera que esto se declare solo en el archivo de configuración de servlet.

En Spring 2.5 acabo de usar <context:annotation-config />y las <context:component-scan base='...'/>etiquetas declararon tanto en la application-context.xmlconfiguración de servlet del despachador como en los paquetes base apropiados para escanear.

Entonces, me pregunto cuál es la diferencia entre mvc:annotation-driveny las context:annotation-configetiquetas en la configuración del servlet y qué puedo eliminar en los archivos de configuración de Spring 3.

glaz666
fuente

Respuestas:

150

<context:annotation-config>declara soporte para anotaciones generales tales como @Required, @Autowired, @PostConstruct, y así sucesivamente.

<mvc:annotation-driven />declara soporte explícito para controladores MVC basados ​​en anotaciones (es decir @RequestMapping, @Controlleraunque el soporte es el comportamiento predeterminado), y agrega soporte para validación declarativa a través de @Validy organización de mensajes con @RequestBody/ ResponseBody.

skaffman
fuente
3
¿Debo declarar context: annotation-config tanto en applicationContext como en servlet, especialmente si uso diferentes paquetes base en la etiqueta de escaneo de componentes?
glaz666
2
Sí, lo necesitarás <context:annotation-config>en cada contexto.
skaffman
61
@skaffman: <mvc:annotation-driven>no tiene sentido, solo se llama incorrectamente. En realidad se configura soporte para el nuevo Spring MVC características tales como la validación declarativa con @Valid, HTTP conversión de mensajes con @RequestBody/ @ResponseBody, la nueva arquitectura de conversión de campo, etc.
axtavt
55
@ Richards: por lo general sí, ver blog.springsource.com/2009/12/21/…
axtavt 01 de
77
Esta respuesta es simplemente errónea, ya que mvc: la anotación es crucial para las conversiones y la validación. Lo único correcto y valioso aquí es el comentario de @axtavt.
Konrad Garus
36

También hay más detalles sobre el uso de <mvc:annotation-driven />los documentos de Spring . En pocas palabras, <mvc:annotation-driven />le brinda un mayor control sobre el funcionamiento interno de Spring MVC. No necesita usarlo a menos que necesite una o más de las características descritas en la sección de documentos mencionada anteriormente.

Además, hay otras etiquetas "basadas en anotaciones" disponibles para proporcionar funcionalidad adicional en otros módulos Spring. Por ejemplo, <transaction:annotation-driven />permite el uso de la anotación @Transaction, <task:annotation-driven />se requiere para @Scheduled et al ...

seanhodges
fuente
Me gustaría ver un conjunto de configuraciones en xml que son similares a esta etiqueta. Una vez que me encontré con ese ejemplo hace mucho tiempo, pero estaba incompleto, AFAIR.
glaz666
7

mvc: impulsado por anotaciones es una etiqueta agregada en Spring 3.0 que hace lo siguiente:

  1. Configura el Spring 3 Type ConversionService (alternativa a PropertyEditors)
  2. Agrega soporte para formatear campos de Número con @NumberFormat
  3. Agrega compatibilidad para formatear los campos Fecha, Calendario y Hora de Joda con @DateTimeFormat, si Joda Time está en el classpath
  4. Agrega soporte para validar entradas de @Controller con @Valid, si un proveedor JSR-303 está en el classpath
  5. Agrega soporte para soporte para leer y escribir XML, si JAXB está en el classpath (conversión de mensaje HTTP con @ RequestBody / @ ResponseBody)
  6. Agrega soporte para leer y escribir JSON, si Jackson está en el classpath (en la misma línea que # 5)

context: annotation-config Busca anotaciones en beans en el mismo contexto de aplicación que se define y declara el soporte para todas las anotaciones generales como @Autowired, @Resource, @Required, @PostConstruct, etc.

Praveen Kumar KS
fuente
2
Fuente y más detalles sobre mvc: annotation-driver - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0
Aniket Thakur
¿Quiere decir que si necesito @Autowired, @Resource, @Required, @PostConstruct Y @RequestBody, @ResponseBody, todas estas anotaciones, tendré que agregar ambas mvc:annotation-driven context:annotation-configetiquetas en mi configuración?
R Dhaval