后面又寫了一篇類似的,可以看看 捋一捋Spring Web的源碼思路
在Servlet 3.0+ 環境中,你可以編碼式配置Servlet容器,用來代替或者結合 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提供的一個接口,可以讓你的實現被探測到,並被自動用於初始化任何Servlet 3 容器。 它的一個抽象基類實現是 AbstractDispatcherServletInitializer,可以更容易的注冊DispatcherServlet -- 只需要重寫相應的方法、指定servlet的映射、指定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 (注意,基於Java的配置是繼承的AbstractAnnotationConfigDispatcherServletInitializer):
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 (就是添加到DispatcherServlet映射的鏈路上):
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { // ... @Override protected Filter[] getServletFilters() { return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() }; } }
注意,添加的每個filter都有一個默認的name -- 基於其類型,且會被自動映射到DispatcherServlet。
AbstractDispatcherServletInitializer 的isAsyncSupported protected method,可以用來啟用DispatcherServlet和所有映射到它的filters的異步支持。默認,已啟用,true。
最后,如果你需要更進一步的定制DispatcherServlet,你可以重寫 createDispatcherServlet method。
官方文檔地址: