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

你的名字 2022-09-10 05:13 208阅读 0赞

上一篇文章中讲解了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. @Override
  2. protected void customizeRegistration(Dynamic registration) {
  3. registration.setMultipartConfig(
  4. new MultipartConfigElement("/tmp/spittr/uploads"));
  5. }

添加自定义的servlet,filter和listener

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

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

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

  1. @Override
  2. public void onStartup(ServletContext servletContext)
  3. throws ServletException {
  4. javax.servlet.FilterRegistration.Dynamic filter =
  5. servletContext.addFilter("myFilter", MyFilter.class);
  6. filter.addMappingForUrlPatterns(null, false, "/custom/*");
  7. }

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

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

小结

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

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

欢迎扫描下方二维码关注微信公众号【谈谈IT】,第一时间获取最新文章。
欢迎关注同名公众号

发表评论

表情:
评论列表 (有 0 条评论,208人围观)

还没有评论,来说两句吧...

相关阅读