서블릿 환경에서는 대안으로 또는 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("/");
}
}
WebApplicationInitializer
는 Spring MVC에서 제공하는 인터페이스이며, 당신의 구현(implementation)이 감지되고 자동으로 모든 Servlet 3 컨테이너를 초기화하는 데 사용되도록 보장합니다. AbstractDispatcherServletInitializer
라는 WebApplicationInitializer
의 추상 기본 클래스 구현을 사용하면, 서블릿 매핑과 DispatcherServlet
구성의 위치를 지정하는 메서드를 재정의하여 DispatcherServlet
을 훨씬 쉽게 등록할 수 있습니다.
이는 다음 예제와 같이 Java 기반 Spring 구성을 사용하는 애플리케이션에 권장됩니다.
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[] { "/" };
}
}
XML 기반 Spring 구성을 사용하는 경우 다음 예제와 같이 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[] { "/" };
}
}
AbstractDispatcherServletInitializer
는 또한 다음 예제와 같이 Filter
인스턴스를 추가하고 자동으로 DispatcherServlet
에 매핑되도록 하는 편리한 방법을 제공합니다.
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
각 필터는 구체적인 유형에 따라 기본 이름으로 추가되고 자동으로 DispatcherServlet
에 매핑됩니다.
AbstractDispatcherServletInitializer
의 isAsyncSupported
protected 메소드는 DispatcherServlet
및 여기에 매핑된 모든 필터에 대한 비동기 지원을 활성화할 수 있는 단일 위치를 제공합니다. 기본적으로 이 플래그는 true
로 설정됩니다.
마지막으로 DispatcherServlet
자체를 추가로 사용자 정의해야 하는 경우 createDispatcherServlet
메서드를 재정의할 수 있습니다.