Lorsque vous utilisez AbstractAnnotationConfigDispatcherServletInitializer et WebApplicationInitializer?

Je travaille avec Spring 4.0.7

J’ai fait une recherche sur la configuration de Spring MVC via JavaConfig.

Pratiquement jusqu’à hier, j’ai vu deux configurations utilisant ces deux options

  1. étend AbstractAnnotationConfigDispatcherServletInitializer
  2. étend WebMvcConfigurerAdapter et implémente WebApplicationInitializer

Note : (2) sont deux classes, une pour l’extension et l’autre pour l’implémentation

J’utilise (2) parce que j’ai trouvé de nombreux exemples où je suis capable de configurer des convertisseurs, des formateurs, des gestionnaires de ressources, etc.

Mais dans les derniers jours, j’ai essayé d’aider une question sur StackOverflow et je me suis rendu compte que (1) existait. J’ai fait une vue d’ensemble sur Google à propos de (1)

Ma question est comment le titre de cet article décrit.

Je vous remercie

Avec la sortie de la spécification Servlet 3.0, il est devenu possible de configurer votre conteneur de servlets avec (presque) aucun xml. Pour cela, il existe le ServletContainerInitializer dans la spécification Servlet. Dans cette classe, vous pouvez enregistrer des filtres, des écouteurs, des servlets, etc., comme vous le feriez traditionnellement dans un web.xml .

Spring fournit une implémentation de SpringServletContainerInitializer qui sait gérer les classes WebApplicationInitializer . Spring fournit également deux classes de base à étendre pour vous simplifier la vie. AbstractAnnotationConfigDispatcherServletInitializer fait partie. Il enregistre un ContextLoaderlistener (facultatif) et un DispatcherServlet et vous permet d’append facilement des classes de configuration à charger pour les deux classes et d’appliquer des filtres au DispatcherServlet et de fournir le mappage de servlet.

WebMvcConfigurerAdapter de configurer Spring MVC, le remplacement du fichier xml chargé par DispatcherServlet pour la configuration de Spring MVC. WebMvcConfigurerAdapter doit être utilisé pour une classe @Configuration .

 @Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter implements WebApplicationInitializer { ... } 

Je ne recommanderais pas de mélanger ceux-ci car ils sont fondamentalement 2 préoccupations différentes. Le premier consiste à configurer le conteneur de servlets, ce dernier pour configurer Spring MVC.

Vous voudriez les diviser en 2 classes.

Pour la configuration

 @Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter { ... } 

Pour amorcer l’application.

 public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class[] getRootConfigClasses() { return new Class[] {RootConfig.class}; } protected Class[] getServletConfigClasses() { return new Class[] {WebConfiguration .class}; } protected Ssortingng[] getServletMappings() { return new Ssortingng[] {"/"}; } } 

Un avantage supplémentaire est que vous pouvez désormais utiliser les classes de commodité fournies par Spring au lieu de configurer manuellement DispatcherServlet et / ou ContextLoaderListener .

Pour commencer depuis le début, il convient de regarder comment le conteneur de servlets démarre.

  • SpringServletContainerInitializer est automatiquement initialisé par tout conteneur Servlet 3.0.
  • SpringServletContainerInitializer recherche les classes implémentant WebApplicationInitializer (lien vers spring.io ; également décrit dans ” Spring In Action ” 4ème édition de Craig Walls, p.135).

Donc, pour commencer, SpringServletContainerInitializer doit trouver la bonne classe implémentant WebApplicationInitializer . Il y a deux façons de le faire:

  1. L’une consiste à implémenter WebApplicationInitializer tout seul; l’interface a été introduite dans Spring 3.1
  2. La seconde est en étendant la classe AbstractAnnotationConfigDispatcherServletInitializer qui implémente également WebApplicationInitializer. La classe a été introduite dans Spring 3.2 pour plus de commodité et constitue «l’approche privilégiée pour les applications qui utilisent une configuration Spring basée sur Java». – voir le lien. Il vous permet de démarrer le contexte d’application de servlet ainsi que le contexte d’application racine.

Je voudrais également souligner que WebMvcConfigurerAdapter que vous mentionnez ne doit pas être confondu avec WebApplicationInitializer. Comme son nom l’indique, cela concerne la configuration de “Mvc”. C’est une classe d’adaptateur qui implémente des méthodes vides de WebMvcConfigurer . Vous l’utilisez lorsque vous configurez votre contrôleur Mvc avec l’annotation @EnableWebMvc .

J’espère que cela t’aides.