Приложения могут объявлять инфраструктурные бины, которые необходимы для обработки запросов. DispatcherServlet
проверяет WebApplicationContext
для каждого специализированного бина. Если подходящих типов бинов нет, то используются типы по умолчанию, перечисленные в файле DispatcherServlet.properties
.
В большинстве случаев MVC Config является лучшей отправной точкой. Он объявляет необходимые бины на Java или XML и предоставляет API обратного вызова конфигурации более высокого уровня для их настройки.
1.1.4. Конфигурация сервлетов
В окружении Servlet 3.0+ есть возможность конфигурировать контейнер сервлетов программно в качестве альтернативы или в сочетании с файлом web.xml
. В следующем примере регистрируется DispatcherServlet
:
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("/");
}
}
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, как показано в следующем примере:
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[] { "/" };
}
}
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
, как показано в следующем примере:
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[] { "/" };
}
}
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
, как показано в следующем примере:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
class MyWebAppInitializer : AbstractDispatcherServletInitializer() {
// ...
override fun getServletFilters(): Array<Filter> {
return arrayOf(HiddenHttpMethodFilter(), CharacterEncodingFilter())
}
}
Каждый фильтр добавляется с именем по умолчанию, основанным на его конкретном типе, и автоматически отображается на DispatcherServlet
.
Защищенный метод isAsyncSupported
в AbstractDispatcherServletInitializer
предоставляет единственное место для активации поддержки асинхронности в DispatcherServlet
и всех фильтрах, отображенных на него. По умолчанию этот флаг установлен в true
.
Наконец, если требуется дополнительно настроить сам DispatcherServlet
, то можно переопределить метод createDispatcherServlet
.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ