跳至主要內容

SpringMVC源码学习-SpringMVC的启动与请求处理流程

科哒大约 3 分钟

根据流程图信息,SpringMVC的启动与请求处理流程可分为以下核心步骤:


一、启动流程

  1. DispatcherServlet初始化
    • 作用:作为SpringMVC的前端控制器,接收所有HTTP请求。
    • 关键动作
      • 初始化Spring容器(加载应用上下文)。
      • 加载并初始化九大核心组件(如HandlerMappingHandlerAdapter等)。
    • 源码入口DispatcherServlet.init()方法触发容器初始化。
  2. 策略加载
    • 组件初始化
      • HandlerMapping:建立请求URL与Controller方法的映射关系(如@RequestMapping)。
      • HandlerAdapter:适配不同类型的处理器(如基于注解的@Controller、传统的Servlet)。
    • 设计思想:通过策略模式实现高度可扩展性,允许自定义组件替换默认实现。

二、请求处理流程

  1. 请求分发
    • DispatcherServlet接收请求:所有请求首先到达doDispatch()方法。
    • 路由匹配
      • 调用HandlerMapping根据请求路径查找匹配的HandlerExecutionChain(包含目标处理器和拦截器)。
      • 示例RequestMappingHandlerMapping处理@RequestMapping注解的方法。
  2. 处理器适配
    • 适配器选择:通过HandlerAdapter.supports()方法选择能处理当前Handler的适配器。
    • 执行处理:调用适配器的handle()方法执行Controller中的业务逻辑。
    • 常见适配器
      • RequestMappingHandlerAdapter:处理基于注解的Controller。
      • HttpRequestHandlerAdapter:处理静态资源请求。
  3. 参数解析
    • 解析器作用HandlerMethodArgumentResolver将HTTP请求数据转换为方法参数。
    • 常见场景
      • @RequestParam:解析URL参数。
      • @RequestBody:解析JSON请求体。
      • Model对象:传递模型数据。
    • 源码关键点InvocableHandlerMethod.getMethodArgumentValues()遍历解析器解析参数。
  4. 业务逻辑执行
    • Controller方法调用:执行实际的业务代码,返回结果(如视图名称、JSON数据等)。
    • 返回值处理
      • HandlerMethodReturnValueHandler根据注解(如@ResponseBody)决定响应形式。
      • 示例RequestResponseBodyMethodProcessor将返回值序列化为JSON。
  5. 视图解析与渲染
    • 视图解析器ViewResolver将逻辑视图名转换为具体视图对象(如JSP、Thymeleaf模板)。
    • 渲染过程:视图对象合并模型数据,生成最终响应内容(HTML/JSON等)。
  6. 拦截器后处理
    • 拦截器链:按逆序执行postHandle()方法,用于日志记录、资源清理等。
    • 最终响应:通过DispatcherServlet返回给客户端。

三、流程特点

  1. 分层设计
    • 前端控制器DispatcherServlet统一调度,降低组件耦合。
    • 策略模式:各组件(如HandlerMappingViewResolver)可插拔替换。
  2. 扩展性强
    • 自定义解析器:可实现HandlerMethodArgumentResolverHandlerMethodReturnValueHandler扩展参数/返回值处理。
    • 拦截器机制:通过HandlerInterceptor实现预处理和后处理逻辑。
  3. 高效协作
    • 责任链模式:处理器执行链(HandlerExecutionChain)整合拦截器与业务逻辑。
    • 适配器模式:统一不同处理器的执行方式,提升框架灵活性。

四、总结

SpringMVC通过DispatcherServlet作为核心调度者,协调HandlerMapping路由匹配、HandlerAdapter执行适配、参数/返回值解析器以及视图渲染组件,形成了一套高效且灵活的请求处理流水线。其模块化设计使得每个组件职责单一,同时通过扩展点(如拦截器、解析器)支持高度定制化,是经典MVC框架的典范实现。