Приложения могут объявлять инфраструктурные бины, которые необходимы для обработки запросов. DispatcherServlet проверяет WebApplicationContext для каждого специализированного бина. Если подходящих типов бинов нет, то используются типы по умолчанию, перечисленные в файле DispatcherServlet.properties.

В большинстве случаев MVC Config является лучшей отправной точкой. Он объявляет необходимые бины на Java или XML и предоставляет API обратного вызова конфигурации более высокого уровня для их настройки.

Spring Boot основывается на конфигурации MVC на Java для настройки Spring MVC и предоставляет множество дополнительных удобных опций.

1.1.4. Конфигурация сервлетов

В окружении Servlet 3.0+ есть возможность конфигурировать контейнер сервлетов программно в качестве альтернативы или в сочетании с файлом web.xml. В следующем примере регистрируется 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 – это интерфейс, предоставляемый Spring MVC, который позволяет гарантировать обнаружение вашей реализации и её автоматическое использование для инициализации любого контейнера Servlet 3. Абстрактная реализация базового класса WebApplicationInitializer под названием AbstractDispatcherServletInitializer еще больше упрощает регистрацию DispatcherServlet, переопределяя методы для задания отображения сервлетов и местоположения конфигурации DispatcherServlet.

Это рекомендовано для приложений, использующих конфигурацию Spring на базе Java, как показано в следующем примере:

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("/")
    }
}

Если используется конфигурацию Spring на основе XML, то следует расширяться непосредственно из AbstractDispatcherServletInitializer, как показано в следующем примере:

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 также предоставляет удобный способ добавления экземпляров Filter и их автоматического отображения на DispatcherServlet, как показано в следующем примере:

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())
    }
}

Каждый фильтр добавляется с именем по умолчанию, основанным на его конкретном типе, и автоматически отображается на DispatcherServlet.

Защищенный метод isAsyncSupported в AbstractDispatcherServletInitializer предоставляет единственное место для активации поддержки асинхронности в DispatcherServlet и всех фильтрах, отображенных на него. По умолчанию этот флаг установлен в true.

Наконец, если требуется дополнительно настроить сам DispatcherServlet, то можно переопределить метод createDispatcherServlet.