对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

Servlet配置

在Servlet环境中,您可以选择以编程方式配置Servlet容器,作为替代方案或与web.xml文件结合使用。 以下示例注册了一个DispatcherServletspring-doc.cadn.net.cn

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 容器。 一个名为 AbstractDispatcherServletInitializerWebApplicationInitializer 抽象基类实现使得通过重写方法来指定 servlet 映射和 DispatcherServlet 配置的位置,从而更轻松地注册 DispatcherServletspring-doc.cadn.net.cn

这对于使用基于Java的Spring配置的应用程序是推荐的,正如以下示例所示:spring-doc.cadn.net.cn

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("/")
	}
}

如果您使用基于XML的Spring配置,您应该直接从 AbstractDispatcherServletInitializer继承,如下例所示:spring-doc.cadn.net.cn

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,如下例所示:spring-doc.cadn.net.cn

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())
	}
}

每个过滤器都使用基于其具体类型的默认名称添加,并自动映射到DispatcherServletspring-doc.cadn.net.cn

The isAsyncSupported 受保护的方法在 AbstractDispatcherServletInitializer 提供了一个启用异步支持的单一位置,适用于 DispatcherServlet 和所有 映射到它的过滤器。默认情况下,此标志设置为 truespring-doc.cadn.net.cn

最后,如果你需要进一步自定义DispatcherServlet本身,你可以重写createDispatcherServlet方法。spring-doc.cadn.net.cn