SpringMVC源码学习-SpringMVC的启动与请求处理流程
大约 3 分钟
根据流程图信息,SpringMVC的启动与请求处理流程可分为以下核心步骤:
一、启动流程
- DispatcherServlet初始化
- 作用:作为SpringMVC的前端控制器,接收所有HTTP请求。
- 关键动作:
- 初始化Spring容器(加载应用上下文)。
- 加载并初始化九大核心组件(如
HandlerMapping
、HandlerAdapter
等)。
- 源码入口:
DispatcherServlet.init()
方法触发容器初始化。
- 策略加载
- 组件初始化:
HandlerMapping
:建立请求URL与Controller方法的映射关系(如@RequestMapping
)。HandlerAdapter
:适配不同类型的处理器(如基于注解的@Controller
、传统的Servlet
)。
- 设计思想:通过策略模式实现高度可扩展性,允许自定义组件替换默认实现。
- 组件初始化:
二、请求处理流程
- 请求分发
- DispatcherServlet接收请求:所有请求首先到达
doDispatch()
方法。 - 路由匹配:
- 调用
HandlerMapping
根据请求路径查找匹配的HandlerExecutionChain
(包含目标处理器和拦截器)。 - 示例:
RequestMappingHandlerMapping
处理@RequestMapping
注解的方法。
- 调用
- DispatcherServlet接收请求:所有请求首先到达
- 处理器适配
- 适配器选择:通过
HandlerAdapter.supports()
方法选择能处理当前Handler的适配器。 - 执行处理:调用适配器的
handle()
方法执行Controller中的业务逻辑。 - 常见适配器:
RequestMappingHandlerAdapter
:处理基于注解的Controller。HttpRequestHandlerAdapter
:处理静态资源请求。
- 适配器选择:通过
- 参数解析
- 解析器作用:
HandlerMethodArgumentResolver
将HTTP请求数据转换为方法参数。 - 常见场景:
@RequestParam
:解析URL参数。@RequestBody
:解析JSON请求体。Model
对象:传递模型数据。
- 源码关键点:
InvocableHandlerMethod.getMethodArgumentValues()
遍历解析器解析参数。
- 解析器作用:
- 业务逻辑执行
- Controller方法调用:执行实际的业务代码,返回结果(如视图名称、JSON数据等)。
- 返回值处理:
HandlerMethodReturnValueHandler
根据注解(如@ResponseBody
)决定响应形式。- 示例:
RequestResponseBodyMethodProcessor
将返回值序列化为JSON。
- 视图解析与渲染
- 视图解析器:
ViewResolver
将逻辑视图名转换为具体视图对象(如JSP、Thymeleaf模板)。 - 渲染过程:视图对象合并模型数据,生成最终响应内容(HTML/JSON等)。
- 视图解析器:
- 拦截器后处理
- 拦截器链:按逆序执行
postHandle()
方法,用于日志记录、资源清理等。 - 最终响应:通过
DispatcherServlet
返回给客户端。
- 拦截器链:按逆序执行
三、流程特点
- 分层设计
- 前端控制器:
DispatcherServlet
统一调度,降低组件耦合。 - 策略模式:各组件(如
HandlerMapping
、ViewResolver
)可插拔替换。
- 前端控制器:
- 扩展性强
- 自定义解析器:可实现
HandlerMethodArgumentResolver
或HandlerMethodReturnValueHandler
扩展参数/返回值处理。 - 拦截器机制:通过
HandlerInterceptor
实现预处理和后处理逻辑。
- 自定义解析器:可实现
- 高效协作
- 责任链模式:处理器执行链(HandlerExecutionChain)整合拦截器与业务逻辑。
- 适配器模式:统一不同处理器的执行方式,提升框架灵活性。
四、总结
SpringMVC通过DispatcherServlet作为核心调度者,协调HandlerMapping
路由匹配、HandlerAdapter
执行适配、参数/返回值解析器以及视图渲染组件,形成了一套高效且灵活的请求处理流水线。其模块化设计使得每个组件职责单一,同时通过扩展点(如拦截器、解析器)支持高度定制化,是经典MVC框架的典范实现。