Spring in Acton 4 读书笔记之 Spring MVC 高级配置

字数718 大约花费3分钟

目录

  1. 1. 为 DispatcherServlet 添加自定义配置
  2. 2. 添加自定义的 servlet,filter 和 listener
  3. 3. 小结

上一篇文章 中讲解了 Spring MVC 的基础配置,本文对应 Spring in Action(Spring 实战)第四版第七章中(7.1.1 Customizing DispatcherServlet configuration)和 (7.1.2 Adding additional servlets and filters) 的内容,将讲解如何自定义 Spring MVC 的配置。

如同在上一篇文章所介绍的,任何继承了 AbstractAnnotationConfigDispatcherServletInitializer 的类都会自动被用来在应用程序 DispatcherServlet 上下文中配置 DispatcherServlet 和其它应用上下文。AbstractAnnotationConfigDispatcherServletInitializer 定义了三个抽象方法,getServletMappings,getServletConfigClasses 以及 getRootConfigClasses,分别定义默认的 servlet 映射、DispatcherServlet 上下文配置文件以及其它(中间层和后端)应用上下文配置文件。继承了 AbstractAnnotationConfigDispatcherServletInitializer 的类必须实现这三个方法。

为 DispatcherServlet 添加自定义配置

除了以上三个一定要进行的配置外,根据使用场景的不同,有时需要进行一些其它的配置。AbstractAnnotationConfigDispatcherServletInitializer 提供了一些方法,当有需要时,可以通过覆盖这些方法,提供额外的配置。比如 customizeRegistration 方法,AbstractAnnotationConfigDispatcherServletInitializer 在 servlet 上下文中注册了 DispatcherServlet 之后,会调用 customizeRegistration 方法,通过覆盖 customizeRegistration 方法,可以为 DispatcherServlet 提供额外配置。比如下面的代码就是在处理类型为 multipart 的请求,将临时文件夹定义为 /tmp/spittr/uploads。

1
2
3
4
5
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/spittr/uploads"));
}

添加自定义的 servlet,filter 和 listener

AbstractAnnotationConfigDispatcherServletInitializer 会创建 DispatcherServlet 和 ContextLoaderListener。但是如果想要添加额外的 servlet,filter 和 listener,需要自己再创建。幸运的是,要在 web 容器中添加组件,只需要创建 initializer 类。最简单的方式就是实现 Spring 的 WebApplicationInitializer 接口。下面的代码注册了一个新的 servlet,并且为这个 servlet 定义了 mapping。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.myapp.config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;
import com.myapp.MyServlet;
public class MyServletInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {

Dynamic myServlet =
servletContext.addServlet("myServlet", MyServlet.class);
myServlet.addMapping("/custom/**");
}
}

下面的代码为相应的 servletContext 新增了一个 filter。

1
2
3
4
5
6
7
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {

javax.servlet.FilterRegistration.Dynamic filter =
servletContext.addFilter("myFilter", MyFilter.class);
filter.addMappingForUrlPatterns(null, false, "/custom/*");
}

可以看到,WebApplicationInitializer 非常灵活,但是如果只是想给 DispatcherServlet 增加 filter,可以直接使用 AbstractAnnotationConfigDispatcherServletInitializer 的 getServletFilters 方法。

1
2
3
4
@Override
protected Filter[] getServletFilters() {
return new Filter[] { new MyFilter() };
}

小结

我们可以使用 AbstractAnnotationConfigDispatcherServletInitializer 生成和配置 DispatcherServlet 以及 ContextLoaderListener,以对 Spring MVC 进行一些配置,还可以使用 WebApplicationInitializer,为 web 容器添加额外的 servlet,filter 和 listener。

本文简单提及了如何处理 multipart 的请求,在下篇文章中,将对此进行详细讲解。

谈谈 IT的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/spring-mvc-advanced-config/

谈谈IT

欢迎关注官方微信公众号获取最新原创文章