spring in action 7.1 小结

0 AbstractAnnotationConfigDispatcherServletInitializer剖析,在Servlet 3.0环境中,容器会在类路径中查找实现ServletContainerInitializer接口的类,如果能发现的话,就用他来配置SErvlet容器。

Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer接口的类,并将配置任务交给他们来完成。Spring 3.2引入了 便利的WebApplicationInitializer的实现类,就是AbstractAnnotationConfigDispatcherServletInitializer 。如果一个类继承了AbstractAnnotationConfigDispatcherServletInitializer 同时也就实现了WebApplicationInitializer 接口。当部署到Servlet 3.0容器中的时候,容器会自动发现他,并用来配置Servlet 上下文。

说明:支持Servlet3.0 服务器,如tomcat 7版本及以上

0.1 两个应用上下文,DispatcherServlet 和 ContextLoaderListener

DispatcherServlet 加载包含web组件的bean,如控制器、视图解析器以及处理器映射。

ContextLoaderListener 加载应用中其他的bean,通常是驱动应用后端的中间层和数据层组件。

DispatcherServlet 在启动的时候会加载重写的如下方法中的配置类中的bean。

protected Class<?>[] getServletConfigClasses() {
        return new Class[0];
    }

0.2 自定义 DispatcherServlet  配置

AbstractAnnotationConfigDispatcherServletInitializer 将 DispatcherServlet 注册到Servlet 容器后,会调用 customizeRegistration(ServletRegistration.Dynamic registration) ,我们可以对该方法进行重载,从而实现额外的配置。

传进来的Dynamic 对象可以设置 setMultipartConfig() 对 muitipart 的支持,setInitParameter()设置初始化参数。

1 添加其他的Servlet和Filter,按照AbstractAnnotationConfigDispatcherServletInitializer的定义,它会创建DispatcherServlet和 ContextLoaderListener。如果你想注册其他的Servlet, Filter, Listener。只需创建一个新的初始化器即可。最简单的方式是实现 spring 的 WebApplicationInitializer 接口。

在方法中

1)注册Filter/Servlet/Listener

2)添加映射路径

public class MyServletInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext servletContext) throws ServletException {
        ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
        myServlet.addMapping("/custome/**");

    }

}

例如:添加 characterEncodingFilter 使用如下方法

public class CharacterEncodingFilterInitializer implements WebApplicationInitializer {
    public void onStartup(ServletContext servletContext) throws ServletException {
        FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("CharacterEncodingFilter", CharacterEncodingFilter.class);
        characterEncodingFilter.setInitParameter("encoding","utf-8");
        characterEncodingFilter.addMappingForUrlPatterns(null, false,"/*");
        
    }
}

2 如果将应用部署到支持Servlet 3.0的容器中,那么注册Filter/Servlet/Listener有更简单的方式。

比如要注册Filter,并且该Filter映射到DispatcherServlet,仅需要重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters方法。该方法没有为filter配置映射路径,返回的所有Filter都会映射到DispatcherServlet

@Override
    protected Filter[] getServletFilters() {
        return new Filter[] {new MyFilter()};
    }
原文地址:https://www.cnblogs.com/zhaopengcheng/p/7056676.html