Quand utiliser AbstractAnnotationConfigDispatcherservletinitializer et WebApplicationInitializer?

je travaille avec Spring 4.0.7

j'ai fait une recherche sur la MVC de configure Spring par JavaConfig.

pratiquement jusqu'à hier j'ai vu deux configurations utilisant ces deux options

  1. extend AbstractAnnotationConfigDispatcherservletinitializer
  2. étend WebMvcConfigurerAdapter et implémente WebApplicationInitializer

Remarque:: (2) sont deux classes, une pour l'extension et l'autre pour la mise en œuvre

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 j'ai réalisé (1) existe.. J'ai fait quelques aperçu sur Google à propos de (1) et il existe quelques exemples de travailler avec (1)

Ma question est comment le titre de ce post décrire.

Merci

38
demandé sur Manuel Jordan 2014-10-31 17:15:39

2 réponses

avec la sortie de la spécification Servlet 3.0, il est devenu possible de configurer votre conteneur Servlet avec (presque) pas de xml. Pour cela, il est à l' 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 du SpringServletContainerInitializer qui sait comment gérer WebApplicationInitializer classes. Le printemps fournit également un couple de les cours de base à étendre pour rendre votre vie plus facile le AbstractAnnotationConfigDispatcherServletInitializer est l'un de ceux-ci. Il enregistre ContextLoaderlistener (en option) et un DispatcherServlet et vous permet d'ajouter facilement des classes de configuration à charger pour les deux classes et d'appliquer des filtres à l' DispatcherServlet et de fournir la cartographie des servlets.

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

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

Je ne recommande pas de mélanger ceux-ci car il s'agit essentiellement de deux préoccupations différentes. La première est pour configurer le conteneur servlet, la seconde pour configurer le MVC du ressort.

vous voudriez les diviser en 2 classes.

Pour la configuration.

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

Pour le démarrage de 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 maintenant utiliser les classes de confort fournies par Spring à la place de configurer manuellement le DispatcherServlet et/ou ContextLoaderListener.

50
répondu M. Deinum 2016-07-31 20:16:54

pour commencer depuis le début, il est intéressant de regarder comment commence le conteneur servlet.

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

  1. On est par la mise en œuvre de WebApplicationInitializer seul; l'interface a été introduite au printemps 3.1
  2. la seconde est d'étendre AbstractAnnotationConfigDispatcherservletinitializer classe qui implémente également WebApplicationInitializer. La classe a été introduit au printemps 3.2 Pour la commodité et il est "l'approche préférée pour les applications qui utilisent la configuration Java Spring."- voir le lien. Il vous permet de lancer le contexte d'application servlet ainsi que le contexte d'application racine.

je tiens également à higlight que WebMvcConfigurerAdapter vous mentionnez ne doit pas être confondu avec WebApplicationInitializer. Comme son nom l'indique - il s'agit de configurer "Mvc". C'est un adaptateur classe implémente des méthodes vides de WebMvcConfigurer. Vous l'utilisez lorsque vous configurez votre contrôleur Mvc @EnableWebMvc annotation.

J'espère que cela vous aidera.

10
répondu Witold Kaczurba 2017-01-04 06:38:50