mvc - spring tutorial
¿Cuándo usar AbstractAnnotationConfigDispatcherServletInitializer y WebApplicationInitializer? (2)
Estoy trabajando con Spring 4.0.7
Hice una investigación sobre la configuración Spring MVC a través de JavaConfig.
Prácticamente hasta ayer he visto dos configuraciones usando estas dos opciones
- extends AbstractAnnotationConfigDispatcherServletInitializer
- extiende WebMvcConfigurerAdapter e implementa WebApplicationInitializer
Nota : (2) son dos clases, una para extensión y otra para implementación
Estoy usando (2) porque he encontrado muchos ejemplos en los que puedo configurar convertidores, formateadores, manejadores de recursos, etc.
Pero en los últimos días he intentado ayudar con una pregunta sobre StackOverflow y me di cuenta de que (1) existe. Hice una descripción general en Google sobre (1) y existen algunos ejemplos que trabajan con (1)
Mi pregunta es cómo describe el título de esta publicación.
Gracias
Para comenzar desde el principio, vale la pena investigar cómo se inicia el contenedor de servlets.
- SpringServletContainerInitializer se SpringServletContainerInitializer automáticamente por cualquier contenedor de Servlet 3.0.
- SpringServletContainerInitializer busca clases que implementen WebApplicationInitializer (enlace a spring.io , también bien descrito en " Spring In Action ", cuarta edición de Craig Walls, p.135).
Para comenzar, SpringServletContainerInitializer tiene que encontrar la clase correcta que implementa WebApplicationInitializer . Hay dos formas de hacerlo realidad:
- Uno es implementar WebApplicationInitializer por sí mismo; la interfaz fue introducida en Spring 3.1
- El segundo es extendiendo la clase AbstractAnnotationConfigDispatcherServletInitializer que también implementa WebApplicationInitializer. La clase se introdujo en Spring 3.2 por conveniencia y es "el enfoque preferido para las aplicaciones que usan la configuración de Spring basada en Java". - mira el enlace. Le permite iniciar el contexto de la aplicación de servlets, así como el contexto de la aplicación raíz.
También me gustaría destacar que WebMvcConfigurerAdapter que mencionas no debe confundirse con WebApplicationInitializer. Como su nombre lo indica, tiene que ver con la configuración de "Mvc". Es una clase de adaptador que implementa métodos vacíos desde WebMvcConfigurer . Lo usa cuando configura su controlador @EnableWebMvc con la anotación @EnableWebMvc .
Espero que esto ayude.
Con el lanzamiento de la especificación Servlet 3.0, fue posible configurar su Servlet Container con (casi) ningún xml. Para esto, existe el ServletContainerInitializer
en la especificación Servlet. En esta clase puede registrar filtros, oyentes, servlets, etc. como lo haría tradicionalmente en un web.xml
.
Spring proporciona una implementación de SpringServletContainerInitializer
que sabe cómo manejar clases de WebApplicationInitializer
. Spring también proporciona un par de clases base para ampliar para hacer su vida más fácil. AbstractAnnotationConfigDispatcherServletInitializer
es una de ellas. Registra un ContextLoaderlistener
(opcionalmente) y un DispatcherServlet
y le permite agregar fácilmente clases de configuración para cargar ambas clases y aplicar filtros al DispatcherServlet
y proporcionar el mapeo de servlet.
El WebMvcConfigurerAdapter
es para configurar Spring MVC, la sustitución del archivo xml cargado por DispatcherServlet
para configurar Spring MVC. El WebMvcConfigurerAdapter
debe usar para una clase @Configuration
.
@Configuration
@EnableWebMvc
public class WebConfiguration
extends WebMvcConfigurerAdapter implements WebApplicationInitializer
{ ... }
No recomendaría mezclarlos, ya que básicamente son dos preocupaciones diferentes. El primero es para configurar el contenedor de servlets, el último para configurar Spring MVC.
Deberías dividirlos en 2 clases.
Para la configuración
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter { ... }
Para arrancar la aplicación.
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[] {"/"};
}
}
Una ventaja añadida es que ahora puede usar las clases de conveniencia proporcionadas por Spring en lugar de configurar manualmente el DispatcherServlet
y / o ContextLoaderListener
.