Quelle est la différence entre <mvc: annotation-driven /> et <context: annotation-config /> dans le servlet?

155

Je migre du printemps 2.5 au printemps 3.

Ils ont introduit <mvc:annotation-driven />ce qui fait de la magie noire. Cela devrait être déclaré uniquement dans le fichier de configuration du servlet.

Au printemps 2.5, je viens d'utiliser <context:annotation-config />et des <context:component-scan base='...'/>balises déclarées à la fois dans application-context.xmlet dans la configuration du servlet du répartiteur XML avec les packages de base appropriés à analyser.

Je me demande donc quelle est la différence entre les balises mvc:annotation-drivenet context:annotation-configdans la configuration de servlet et que puis-je éliminer dans les fichiers de configuration Spring 3?

glaz666
la source

Réponses:

150

<context:annotation-config>déclare le soutien des annotations générales telles que @Required, @Autowired, @PostConstructet ainsi de suite.

<mvc:annotation-driven />déclare la prise en charge explicite des contrôleurs MVC basés sur les annotations (c'est-à @RequestMapping- dire , @Controllerbien que la prise en charge de ceux-ci soit le comportement par défaut), ainsi que l'ajout de la prise en charge de la validation déclarative via @Validet du marshalling du corps du message avec @RequestBody/ ResponseBody.

skaffman
la source
3
dois-je déclarer context: annotation-config à la fois dans applicationContext et servlet, en particulier si j'utilise différents packages de base dans la balise de balayage de composants?
glaz666
2
Oui, vous en aurez besoin <context:annotation-config>dans chaque contexte.
skaffman
61
@skaffman: ce <mvc:annotation-driven>n'est pas inutile, c'est juste mal nommé. En fait, il configure la prise en charge des nouvelles fonctionnalités de Spring MVC telles que la validation déclarative avec @Valid, la conversion de message HTTP avec @RequestBody/ @ResponseBody, la nouvelle architecture de conversion de champ, etc.
axtavt
5
@Richards: Habituellement oui, voir blog.springsource.com/2009/12/21
...
7
Cette réponse est tout simplement fausse, car mvc: la fonction d'annotation est cruciale pour les conversions et la validation. La seule chose correcte et valable ici est le commentaire de @axtavt.
Konrad Garus
36

Il y a également plus de détails sur l'utilisation de <mvc:annotation-driven />dans la documentation Spring . En un mot, <mvc:annotation-driven />vous donne un meilleur contrôle sur le fonctionnement interne de Spring MVC. Vous n'avez pas besoin de l'utiliser sauf si vous avez besoin d'une ou plusieurs des fonctionnalités décrites dans la section susmentionnée de la documentation.

En outre, il existe d'autres balises «basées sur les annotations» disponibles pour fournir des fonctionnalités supplémentaires dans d'autres modules Spring. Par exemple, <transaction:annotation-driven />permet l'utilisation de l'annotation @Transaction, <task:annotation-driven />est requis pour @Scheduled et al ...

seanhodges
la source
Je voudrais voir un ensemble de paramètres en xml qui sont similaires à cette balise. Une fois, je suis tombé sur cet exemple il y a longtemps, mais il était incomplet, AFAIR.
glaz666
7

mvc: basé sur les annotations est une balise ajoutée dans Spring 3.0 qui effectue les opérations suivantes:

  1. Configure le service de conversion de type Spring 3 (alternative à PropertyEditors)
  2. Ajoute la prise en charge de la mise en forme des champs numériques avec @NumberFormat
  3. Ajoute la prise en charge du formatage des champs Date, Calendrier et Heure Joda avec @DateTimeFormat, si Joda Time est sur le chemin de classe
  4. Ajoute la prise en charge de la validation des entrées @Controller avec @Valid, si un fournisseur JSR-303 est sur le chemin de classe
  5. Ajoute la prise en charge de la prise en charge de la lecture et de l'écriture de XML, si JAXB est sur le chemin de classe (conversion de message HTTP avec @ RequestBody / @ ResponseBody)
  6. Ajoute la prise en charge de la lecture et de l'écriture de JSON, si Jackson est sur le chemin de classe (le long des mêmes lignes que # 5)

context: annotation-config Recherche les annotations sur les beans dans le même contexte d'application qu'il est défini et déclare la prise en charge de toutes les annotations générales telles que @Autowired, @Resource, @Required, @PostConstruct, etc.

Praveen Kumar KS
la source
2
Source et plus de détails sur mvc: annotation-driver - spring.io/blog/2009/12/21/mvc-simplifications-in-spring-3-0
Thakur
Donc, vous voulez dire, si j'ai besoin de @Autowired, @Resource, @Required, @PostConstruct ET @RequestBody, @ResponseBody- toutes ces annotations, alors je devrai ajouter ces deux mvc:annotation-driven context:annotation-configbalises dans ma configuration?
R Dhaval