web-dev-qa-db-fra.com

Quand utiliser 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) car j'ai trouvé de nombreux exemples où je suis capable de configurer des convertisseurs, des formateurs, des gestionnaires de ressources etc…

Mais ces derniers jours, j'ai essayé d'aider une question sur StackOverflow et j'ai réalisé que (1) existe .. J'ai fait un aperçu sur Google à propos de (1) et existe quelques exemples de travail avec (1)

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

Je vous remercie

41
Manuel Jordan

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 y a 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 des classes SpringServletContainerInitializer qui sait gérer les classes WebApplicationInitializer . Spring propose également quelques classes de base à étendre pour vous faciliter la vie, le AbstractAnnotationConfigDispatcherServletInitializer en fait partie. Il enregistre un ContextLoaderlistener (facultatif) et un DispatcherServlet et vous permet d'ajouter facilement des classes de configuration à charger pour les deux classes et d'appliquer des filtres au DispatcherServlet et de fournir le servlet cartographie.

Le WebMvcConfigurerAdapter sert à configurer Spring MVC, le remplacement du fichier xml chargé par le DispatcherServlet pour configurer Spring MVC. WebMvcConfigurerAdapter doit être utilisé pour un @Configuration classe.

@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 sert à configurer le conteneur de servlet, le second à 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 String[] getServletMappings() {
        return new String[] {"/"};
    }

}

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.

55
M. Deinum

Pour commencer depuis le début, il vaut la peine de voir comment le conteneur de servlet démarre.

  • SpringServletContainerInitializer est démarré automatiquement par n'importe quel conteneur Servlet 3.0.
  • SpringServletContainerInitializer recherche les classes implémentant WebApplicationInitializer (lien vers spring.io ; également bien décrit dans " Spring In Action " 4ème édition par Craig Walls, p.135).

Donc, pour commencer - SpringServletContainerInitializer doit trouver la bonne classe implémentant WebApplicationInitializer . Il y a deux façons d'y arriver:

  1. L'une consiste à implémenter WebApplicationInitializer seul; l'interface a été introduite au printemps 3.1
  2. La seconde consiste à étendre la classe AbstractAnnotationConfigDispatcherServletInitializer qui implémente également WebApplicationInitializer. La classe a été introduite dans Spring 3.2 pour plus de commodité et c'est "l'approche préféré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 a à voir avec la configuration de "Mvc". Il s'agit d'une classe d'adaptateur qui implémente des méthodes vides de WebMvcConfigurer . Vous l'utilisez lorsque vous configurez votre contrôleur Mvc avec @ EnableWebMvc annotation.

J'espère que cela t'aides.

12
Witold Kaczurba