Spring 4 官方文檔學習(十一)Web MVC 框架之編碼式Servlet容器初始化


后面又寫了一篇類似的,可以看看 捋一捋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。

 

 

官方文檔地址:

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-container-config


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM