
Spring 核心为 IoC 和 AOP,我已经在之前有所涉猎了解,因此本篇文章主要讨论 SpringMVC,以期对一个请求在 SpringMVC 中的处理流程有一个比较清晰的认识。
关键概念
servlet:Java 语言处理网络请求(一般是 http )的接口,它定义了处理 request 的规范,实现了 servlet 的 web 应用程序常常需要放置到 servlet 容器(如 tomcat )中运行
DispatcherServlet:SpringMVC 中 HTTP 请求的中心控制器,也是对 servlet 规范的实现,它负责对一个请求的全周期处理
HandlerMapping:保存了某个合法请求对应的处理信息,比如拦截器、处理器等,负责为请求找到合适的处理器
HandlerAdapter:该类进行对Controller中的实际方法的调用
HandlerExceptionResolver:负责处理异常的请求
ViewResolver:负责将视图名称解析为View
View:该对象用于将模板渲染成html或其他类型的文件
DispatcherServlet运行在IoC机制下
DispatcherServlet 在使用之前往往会被通过 IoC 机制被注入到 Servlet WebApplicationContext 中,后者将为前者提供相应的配置信息和与之交互的实际的 Bean 对象(如下图),Servlet WebApplicationContext 可以被理解为一个 web 网页程序的 IoC 工厂,负责管理生成的 Bean 对象。这是一个非常重要的过程,因为 SpringMVC 说到底还是在 Spring 框架下的,因此 SpringMVC 中后续的很多操作都是依赖于 IoC 机制的

DispatcherServlet处理请求的流程
在实际的请求处理中,DispatcherServlet 会分派请求给相应的 handlerAdapter、HandlerMapping 等,具体的函数叫做 doDispatch(),其流程为:
1. DispatcherServlet 首先使用 HandlerMappingList,为请求匹配相应的 HandlerMapping,而一旦请求匹配成功,HandlerMapping 会返回一条执行链,接下来的执行就会利用到这个执行链
这里想到的一点是,原来 Spring 中通过 RequestMapping 映射的 url 给相应处理器是通过拦截器实现的,原来我则认为是直接匹配调用方
2. 然后 DispatcherServlet 找到对应的 HandlerAdapter,该类实现了对匹配后请求相应的处理方法的执行,具体来说就是调用相应 controller 中的方法进行实际逻辑的处理。实现这个类的目的是为了免去 DispatcherServlet 直接去执行实现请求的动作,这个类实现了一种非严格意义上的适配器模式,将整体的请求层次划分地更加清晰
如果请求出现了异常,或是无法匹配,将由 HandlerExceptionResolver 处理,该类实现了对访问结果异常的请求处理
在这个过程中,会对前面得到的执行链进行检查,如果发现了满足条件的拦截器,则会执行一系列pre操作和pro操作
3. Controller 执行完会返回 ModelAndView,DispatcherServlet 会将其交由 ViewResolver处理,ViewResolver 会将其解析为最终的View,View填充到最终的渲染视图中
4. 渲染完成后,整个请求过程完成,DispatcherServlet 最终将请求返回给客户端,一个请求的处理过程就这样完成了
参考资料
深入理解SpringMVC(一)工作原理
Spring MVC 原理探秘 - 一个请求的旅行过程