Las aplicaciones pueden declarar beans de infraestructura necesarios para procesar solicitudes. DispatcherServlet comprueba el WebApplicationContext de cada bean especializado. Si no hay tipos de beans adecuados, entonces los tipos predeterminados enumerados en el archivo se utilizan DispatcherServlet.properties .

En la mayoría de los casos, MVC Config es el mejor punto de partida. Declara los beans necesarios en Java o XML y proporciona una API de devolución de llamada de configuración de nivel superior para configurarlos.

Spring Boot se basa en la configuración de Java MVC para configurar Spring MVC y proporciona muchas opciones convenientes adicionales.

1.1.4. Configuración de servlets

En el entorno Servlet 3.0+, es posible configurar el contenedor de servlet mediante programación como alternativa o en combinación con un archivo web.xml. El siguiente ejemplo registra DispatcherServlet:

Java
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}
Kotlin
import org.springframework.web.WebApplicationInitializer
class MyWebApplicationInitializer : WebApplicationInitializer {
    override fun onStartup(container: ServletContext) {
        val appContext = XmlWebApplicationContext()
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
        val registration = container.addServlet("dispatcher", DispatcherServlet(appContext))
        registration.setLoadOnStartup(1)
        registration.addMapping("/")
    }
}

WebApplicationInitializer es una interfaz proporcionada por Spring MVC que le permite garantizar que su implementación se descubra y se utilice automáticamente para inicializar cualquier contenedor de Servlet 3. Una implementación abstracta de WebApplicationInitializer la clase base llamada AbstractDispatcherServletInitializer simplifica aún más el registro de DispatcherServlet al anular los métodos para establecer la visualización del servlet y la ubicación de configuración de DispatcherServlet.

Esto se recomienda para aplicaciones que utilizan una configuración Spring basada en Java, como se muestra en el siguiente ejemplo:

Java
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { MyWebConfig.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
Kotlin
class MyWebAppInitializer : AbstractAnnotationConfigDispatcherServletInitializer() {
    override fun getRootConfigClasses(): Array<Class<*>>? {
        return null
    }
    override fun getServletConfigClasses(): Array<Class<*>>? {
        return arrayOf(MyWebConfig::class.java)
    }
    override fun getServletMappings(): Array<String> {
        return arrayOf("/")
    }

Si está utilizando una configuración Spring basada en XML, debe extenderla directamente desde AbstractDispatcherServletInitializer, como se muestra en el siguiente ejemplo:

Java
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
Kotlin
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
    override fun createRootApplicationContext(): WebApplicationContext? {
        return null
    }
    override fun createServletApplicationContext(): WebApplicationContext {
        return XmlWebApplicationContext().apply {
            setConfigLocation("/WEB-INF/spring/dispatcher-config.xml")
        }
    }
    override fun getServletMappings(): Array<String> {
        return arrayOf("/")
    }
}

AbstractDispatcherServletInitializer también proporciona una manera conveniente de agregar instancias de Filter y asignarlas automáticamente a DispatcherServlet, como se muestra en el siguiente ejemplo:

Java
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
    // ...
    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {
            new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    }
}
Kotlin
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
    // ...
    override fun getServletFilters(): Array<Filter> {
        return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
    }
}

Cada filtro se agrega con un nombre predeterminado basado en su tipo específico y se asigna automáticamente al DispatcherServlet.

El método protegido isAsyncSupported en AbstractDispatcherServletInitializer proporciona un lugar único para habilitar la compatibilidad asíncrona en DispatcherServlet y todos los filtros asignados a él. De forma predeterminada, este indicador está establecido en true.

Por último, si necesita personalizar aún más el DispatcherServlet, puede anular el método createDispatcherServlet.