Spring MVC 是围绕着一个名为 DispatcherServlet 的核心 Servlet 来设计的,DispatcherServlet 提供了一个用于处理请求的公共算法,并且会把这些实际工作委托给 Spring 容器当中的 Bean,同时这些 Bean 都是可配置化。Spring MVC 的这种工作模式非常灵活,因此它支持多种不同的工作流程。

特殊 Bean

DispatcherServlet 会感知到 Spring 容器中以下类型的特殊 Bean:

Bean 类型 说明
HandlerMapping 将 request 映射到 handler,同时会对关联一系列的用于 request 前置和后置处理的 interceptor。HandlerMapping 中的映射是基于某些条件的,不同的 HandlerMapping 实现类的实现细节是不一样的。

两个主要 HandlerMapping 实现类是 RequestMappingHandlerMappingSimpleUrlHandlerMapping。前者支持将 request 映射到使用 @RequestMapping 注解的方法,后者支持显式注册 URI 路径,并会维护它与 handler 的映射关系。
HandlerAdapter 帮助 Dispatcher 调用 request 所映射的 handler,会屏蔽 handler 具体的调用方式。例如调用 @RequestMapping 注解的方法时需要解析注解,HandlerAdapter 的作用就是使 Dispatcher 对这些细节无感知。
HandlerExceptionResolver 解析 exception 的策略,可能会将 exception 解析到 @ExceptionHandler 注解的方法,或者是 HTML 错误页面。
ViewResolver 将从 handler 返回的 String 类型的逻辑视图解析为真实的视图,解析后的视图会被作为 response。
LocaleResolver、LocaleContextResolver 解析客户端所使用的 Locale 和时区,为了能够提供一个国际化的视图。
ThemeResolver 解析 web 应用可以使用的主题。
MultipartResolver 解析 multi-par request,例如在浏览器中上传文件。
FlashMapManager 存储和检索「输入」与「输出」的 FlashMap,该 FlashMap 可用于将一个 request 中的属性传递到另一个 request 中。

工作流程

  1. +---------------------+
  2. | HandlerMapping |
  3. request | +------------------+|
  4. +<--------------------->| |HandlerInterceptor||
  5. | handler, interceptors | +------------------+|
  6. request +-------------------+ | +---------------------+
  7. <--------->| DispatcherServlet |---+
  8. response +-------------------+ | request, handler +----------------+
  9. +<--------------------->| HandlerAdapter |
  10. | view +----------------+
  11. |
  12. | view +----------------+
  13. +<--------------------->| ViewResolver |
  14. response +----------------+
  15. | ^
  16. v |
  17. +----------------+
  18. | LocaleResolver |
  19. +----------------+
  20. | ^
  21. v |
  22. +----------------+
  23. | ThemeResolver |
  24. +----------------+

参考资料