Qual é a diferença entre <mvc: acionado por anotação /> e <context: annotation-config /> no servlet?

155

Estou migrando do Spring 2.5 para o Spring 3.

Eles introduziram o <mvc:annotation-driven />que faz alguma magia negra. Espera-se que seja declarado apenas no arquivo de configuração do servlet.

No Spring 2.5, acabei de usar <context:annotation-config />e as <context:component-scan base='...'/>tags declaradas no application-context.xmlXML de configuração do servlet e no despachante com pacotes base apropriados para varredura.

Então, eu me pergunto qual é a diferença entre mvc:annotation-drivene context:annotation-configtags na configuração do servlet e o que posso eliminar nos arquivos de configuração do Spring 3?

glaz666
fonte

Respostas:

150

<context:annotation-config>declara suporte para anotações gerais, tais como @Required, @Autowired, @PostConstructe assim por diante.

<mvc:annotation-driven />declara suporte explícito a controladores MVC controlados por anotações (ou seja @RequestMapping, @Controllerembora o suporte a esses seja o comportamento padrão), além de adicionar suporte à validação declarativa via @Valide empacotamento do corpo da mensagem com @RequestBody/ ResponseBody.

skaffman
fonte
3
devo declarar context: annotation-config no applicationContext e no servlet, especialmente se eu usar pacotes base diferentes na tag de verificação de componente?
glaz666
2
Sim, você precisará <context:annotation-config>em cada contexto.
skaffman
61
@skaffman: <mvc:annotation-driven>não faz sentido, é apenas um nome impróprio. Na verdade ele configura suporte para o novo Spring MVC recursos como validação declarativa com @Valid, HTTP conversão de mensagens com @RequestBody/ @ResponseBody, nova arquitetura campo de conversão, etc.
axtavt
5
@Richards: Geralmente sim, consulte blog.springsource.com/2009/12/21/…
axtavt
7
Essa resposta está totalmente errada, pois o mvc: acionado por anotações é crucial para conversões e validação. A única coisa correta e válida aqui é o comentário de @axtavt.
21430 Konrad Garus
36

Há também mais alguns detalhes sobre o uso dos documentos<mvc:annotation-driven /> da Primavera . Em poucas palavras, <mvc:annotation-driven />oferece maior controle sobre o funcionamento interno do Spring MVC. Você não precisa usá-lo, a menos que precise de um ou mais dos recursos descritos na seção acima mencionada dos documentos.

Além disso, existem outras tags "acionadas por anotação" disponíveis para fornecer funcionalidade adicional em outros módulos Spring. Por exemplo, <transaction:annotation-driven />habilita o uso da anotação @Transaction, <task:annotation-driven />é necessário para @Scheduled et al ...

seanhodges
fonte
Gostaria de ver um conjunto de configurações em xml semelhantes a essa tag. Uma vez me deparei com esse exemplo há muito tempo, mas ele estava incompleto, AFAIR.
precisa
7

mvc: acionado por anotação é uma marca adicionada no Spring 3.0 que faz o seguinte:

  1. Configura o ConversionService do tipo Spring 3 (alternativa aos PropertyEditors)
  2. Adiciona suporte para formatação de campos numéricos com @NumberFormat
  3. Adiciona suporte à formatação dos campos Data, Calendário e Hora da Joda com @DateTimeFormat, se a Hora da Joda estiver no caminho de classe
  4. Adiciona suporte para validar entradas do @Controller com @Valid, se um provedor JSR-303 estiver no caminho de classe
  5. Adiciona suporte ao suporte para leitura e gravação de XML, se JAXB estiver no caminho de classe (conversão de mensagem HTTP com @ RequestBody / @ ResponseBody)
  6. Adiciona suporte para leitura e gravação de JSON, se Jackson estiver no caminho de classe (na mesma linha que o 5)

context: annotation-config Procura anotações em beans no mesmo contexto de aplicativo definido e declara suporte para todas as anotações gerais como @Autowired, @Resource, @Required, @PostConstruct etc.

Praveen Kumar KS
fonte
2
Fonte e mais detalhes sobre o mvc: driver de anotação - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0
Aniket Thakur
Então você quer dizer, se eu precisar de @Autowired, @Resource, @Required, @PostConstruct AND @RequestBody, @ResponseBody- todas essas anotações, terei que adicionar essas duas mvc:annotation-driven context:annotation-configtags na minha configuração?
R: Dhaval