前面我們的Spring項目都是使用XML文件配置的,包括web.xml
和Spring配置文件。Spring還支持基于代碼的配置,這樣我們的Spring程序就可以脫離web.xml
文件,全部使用代碼來配置。
WebApplicationInitializer接口
第一個接口就是org.springframework.web.WebApplicationInitializer
,我們實現(xiàn)該接口,然后在onStartup方法中就可以使用代碼來配置Servlet容器和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/dispatcher-servlet.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
WebApplicationInitializer
是Spring提供的一個接口,Spring會確保在Servlet容器初始化的時候該接口被自動檢測和使用。
AbstractDispatcherServletInitializer基類
前面介紹的WebApplicationInitializer
接口是最基本的一個接口,所有的初始化代碼都要在接口中實現(xiàn),比較麻煩。Spring因此提供了一個實現(xiàn)了WebApplicationInitializer
接口的基類AbstractDispatcherServletInitializer
,使用它我們可以非常方便的配置Servlet容器。需要異步支持的話,如果實現(xiàn)WebApplicationInitializer
接口的話需要手動設置異步支持標志位,就像web.xml
那樣;如果使用AbstractDispatcherServletInitializer
基類的話不需要設置,Spring已經(jīng)默認支持異步處理了。
使用Java配置
如果我們使用Java代碼配置Spring的話可以繼承AbstractAnnotationConfigDispatcherServletInitializer
基類,然后實現(xiàn)其中的三個方法。
public class MyAnnotationWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootApplicationContextConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{DispatcherServletConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
使用XML配置
如果我們使用傳統(tǒng)XML方式配置Spring,那么就直接繼承AbstractDispatcherServletInitializer
基類,然后實現(xiàn)其中的三個方法。
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/applicationContext.xml");
return cxt;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/dispatcher-servlet.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
過濾器配置
AbstractDispatcherServletInitializer
提供了一個方法用于配置過濾器,只需要重寫getServletFilters()
方法即可。
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new CharacterEncodingFilter() };
}
}