前言
在Spring Xml和JavaConfig一文中曾经使用实现WebApplicationInitializer
的方式举例过, 但未对其进行特殊说明, 这里补充一下:
- 一个应用中可以有多个
WebApplicationInitializer
实例, 但加载顺序不定 - 可以使用抽象类继承
WebApplicationInitializer
的方式预置一些逻辑 Spring
提供了一些抽象启动类, 默认注册了名为dispatcher
的Servlet
, UML如下:
然后暴露抽象方法用于注册Spring Context
.- Spring只提供了注解方式的初始化抽象类, 我们可以仿照其编写
XML
方式的初始化抽象类:import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import javax.servlet.ServletContext; import javax.servlet.ServletRegistration; public abstract class AbstractXmlWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { XmlWebApplicationContext context = new XmlWebApplicationContext(); context.setConfigLocation(getConfigLocation()); context.setConfigLocations(getConfigLocations()); ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } protected abstract String getConfigLocation(); protected abstract String[] getConfigLocations(); }
- 如果项目之前是通过
web.xml
方式配置, 而又须要在其基础上进行增强配置, 比如开启异步请求支持, 可以这样:import org.springframework.web.WebApplicationInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletRegistration; import static org.springframework.web.servlet.support.AbstractDispatcherServletInitializer.DEFAULT_SERVLET_NAME; public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { ServletRegistration servletRegistration = container.getServletRegistration(DEFAULT_SERVLET_NAME); if (servletRegistration instanceof ServletRegistration.Dynamic) { ((ServletRegistration.Dynamic) servletRegistration).setAsyncSupported(true); } } }