前面我们的Spring项目都是使用XML文件配置的,包括web.xml
和Spring配置文件。Spring还支持基于代码的配置,这样我们的Spring程序就可以脱离web.xml
文件,全部使用代码来配置。
WebApplicationInitializer接口
第一个接口就是org.springframework.web.WebApplicationInitializer
,我们实现该接口,然后在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
接口是最基本的一个接口,所有的初始化代码都要在接口中实现,比较麻烦。Spring因此提供了一个实现了WebApplicationInitializer
接口的基类AbstractDispatcherServletInitializer
,使用它我们可以非常方便的配置Servlet容器。需要异步支持的话,如果实现WebApplicationInitializer
接口的话需要手动设置异步支持标志位,就像web.xml
那样;如果使用AbstractDispatcherServletInitializer
基类的话不需要设置,Spring已经默认支持异步处理了。
使用Java配置
如果我们使用Java代码配置Spring的话可以继承AbstractAnnotationConfigDispatcherServletInitializer
基类,然后实现其中的三个方法。
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配置
如果我们使用传统XML方式配置Spring,那么就直接继承AbstractDispatcherServletInitializer
基类,然后实现其中的三个方法。
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() };
}
}