SpringMVC框架执行流程

0 阅读3分钟

SpringMVC 九大核心角色

前端控制器(DispatcherServlet)

  • 角色:中央调度器、总指挥
  • 职责:接收所有请求,统一分发和协调

处理器映射器(HandlerMapping)

  • 角色:路由导航员
  • 职责:根据请求URL找到对应的处理器(建立URL→处理器的映射)

处理器执行链(HandlerExecutionChain)

  • 角色:执行任务包
  • 职责:封装处理器方法 + 拦截器集合,形成完整的执行单元

处理器(Handler)

  • 角色:业务执行者(通常是Controller)
  • 职责:执行业务逻辑,处理具体请求

处理器适配器(HandlerAdapter)

  • 角色:万能转换器
  • 职责:适配不同处理器类型,让DispatcherServlet能用统一方式调用它们

拦截器(Interceptor)

  • 角色:AOP切面卫士
  • 职责:在处理器前后插入通用逻辑(权限、日志等)

ModelAndView

  • 角色:数据视图封装器
  • 职责:携带业务数据(Model)+ 视图信息(View)

视图解析器(ViewResolver)

  • 角色:视图定位器
  • 职责:将逻辑视图名(如"home")解析为具体视图对象(如home.jsp)

视图(View)

  • 角色:页面渲染器
  • 职责:最终渲染HTML/JSON等响应内容

image.png

SpringMVC 执行流程文字性的描述

  1. 用户发送请求到前端控制器(DispatcherServlet)
  2. 控制器调用 doDispatch()  方法进行统一分发
  3. 通过处理器映射器(HandlerMapping)  查找对应的处理器执行链(HandlerExecutionChain)
  4. 执行链包含:处理器方法(HandlerMethod)  + 拦截器列表(Interceptors)
  5. 根据处理器类型获取对应的处理器适配器(HandlerAdapter)
  6. 顺序执行所有拦截器的 preHandle()  方法
  7. 适配器调用处理器的目标方法执行业务逻辑
  8. 处理器返回逻辑视图名给适配器
  9. 适配器封装成 ModelAndView 返回给前端控制器
  10. 逆序执行拦截器的 postHandle()  方法
  11. 前端控制器调用视图解析器(ViewResolver)  解析视图(View)
  12. 视图(View)进行渲染并返回响应
  13. 逆序执行拦截器的 afterCompletion()  方法(无论成功失败都会执行)

常见面试题

Q:处理器映射器和适配器什么时候创建?

在Spring容器启动时,DispatcherServlet初始化阶段创建的。具体是在initStrategies()方法中,通过initHandlerMappings()initHandlerAdapters()方法从Spring容器中获取所有相关Bean,并按优先级排序后缓存在DispatcherServlet中。这样请求到来时就能直接使用,不需要每次请求都重新创建。

Q:请你描述一下 SpringMVC 的执行流程?

  1. 用户发送请求到前端控制器(DispatcherServlet)
  2. 控制器调用 doDispatch()  方法进行统一分发
  3. 通过处理器映射器(HandlerMapping)  查找对应的处理器执行链(HandlerExecutionChain)
  4. 执行链包含:处理器方法(HandlerMethod)  + 拦截器列表(Interceptors)
  5. 根据处理器类型获取对应的处理器适配器(HandlerAdapter)
  6. 顺序执行所有拦截器的 preHandle()  方法
  7. 适配器调用处理器的目标方法执行业务逻辑
  8. 处理器返回逻辑视图名给适配器
  9. 适配器封装成 ModelAndView 返回给前端控制器
  10. 逆序执行拦截器的 postHandle()  方法
  11. 前端控制器调用视图解析器(ViewResolver)  解析视图
  12. 视图进行渲染并返回响应
  13. 逆序执行拦截器的 afterCompletion()  方法(抛异常了也会执行)

Q:DispatcherServlet的作用? \ 它是Spring MVC的总指挥,负责请求分发、协调各组件工作。

Q:为什么需要HandlerAdapter? \ 因为处理器类型多样(Controller、HttpRequestHandler等),适配器模式让DispatcherServlet能用统一方式调用它们。

Q:拦截器三个方法的执行时机? \ preHandle在处理器前,postHandle在处理器后但视图渲染前,afterCompletion在视图渲染后。

Q:过滤器和拦截器在流程中的位置? \ 过滤器在最外层(Tomcat层面),然后才进入Spring MVC的DispatcherServlet → 拦截器 → 处理器。