Програми можуть оголошувати інфраструктурні біни, необхідні для обробки запитів. 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", новий 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[] {
            новий HiddenHttpMethodFilter(), новий CharacterEncodingFilter() };
    }
}
Kotlin
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
    // ...
    override fun getServletFilters(): Array<Filter> {
        return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
    }
}

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

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

Нарешті, якщо потрібно додатково налаштувати сам DispatcherServlet, то можна перевизначити метод createDispatcherServlet.