SpringMVC 九大核心角色
前端控制器(DispatcherServlet)
- 角色:中央调度器、总指挥
- 职责:接收所有请求,统一分发和协调
处理器映射器(HandlerMapping)
- 角色:路由导航员
- 职责:根据请求URL找到对应的处理器(建立URL→处理器的映射)
处理器执行链(HandlerExecutionChain)
- 角色:执行任务包
- 职责:封装处理器方法 + 拦截器集合,形成完整的执行单元
处理器(Handler)
- 角色:业务执行者(通常是Controller)
- 职责:执行业务逻辑,处理具体请求
处理器适配器(HandlerAdapter)
- 角色:万能转换器
- 职责:适配不同处理器类型,让DispatcherServlet能用统一方式调用它们
拦截器(Interceptor)
- 角色:AOP切面卫士
- 职责:在处理器前后插入通用逻辑(权限、日志等)
ModelAndView
- 角色:数据视图封装器
- 职责:携带业务数据(Model)+ 视图信息(View)
视图解析器(ViewResolver)
- 角色:视图定位器
- 职责:将逻辑视图名(如"home")解析为具体视图对象(如home.jsp)
视图(View)
- 角色:页面渲染器
- 职责:最终渲染HTML/JSON等响应内容
SpringMVC 执行流程文字性的描述
- 用户发送请求到前端控制器(DispatcherServlet)
- 控制器调用 doDispatch() 方法进行统一分发
- 通过处理器映射器(HandlerMapping) 查找对应的处理器执行链(HandlerExecutionChain)
- 执行链包含:处理器方法(HandlerMethod) + 拦截器列表(Interceptors)
- 根据处理器类型获取对应的处理器适配器(HandlerAdapter)
- 顺序执行所有拦截器的 preHandle() 方法
- 适配器调用处理器的目标方法执行业务逻辑
- 处理器返回逻辑视图名给适配器
- 适配器封装成 ModelAndView 返回给前端控制器
- 逆序执行拦截器的 postHandle() 方法
- 前端控制器调用视图解析器(ViewResolver) 解析视图(View)
- 视图(View)进行渲染并返回响应
- 逆序执行拦截器的 afterCompletion() 方法(无论成功失败都会执行)
常见面试题
Q:处理器映射器和适配器什么时候创建?
在Spring容器启动时,DispatcherServlet初始化阶段创建的。具体是在initStrategies()方法中,通过initHandlerMappings()和initHandlerAdapters()方法从Spring容器中获取所有相关Bean,并按优先级排序后缓存在DispatcherServlet中。这样请求到来时就能直接使用,不需要每次请求都重新创建。
Q:请你描述一下 SpringMVC 的执行流程?
- 用户发送请求到前端控制器(DispatcherServlet)
- 控制器调用 doDispatch() 方法进行统一分发
- 通过处理器映射器(HandlerMapping) 查找对应的处理器执行链(HandlerExecutionChain)
- 执行链包含:处理器方法(HandlerMethod) + 拦截器列表(Interceptors)
- 根据处理器类型获取对应的处理器适配器(HandlerAdapter)
- 顺序执行所有拦截器的 preHandle() 方法
- 适配器调用处理器的目标方法执行业务逻辑
- 处理器返回逻辑视图名给适配器
- 适配器封装成 ModelAndView 返回给前端控制器
- 逆序执行拦截器的 postHandle() 方法
- 前端控制器调用视图解析器(ViewResolver) 解析视图
- 视图进行渲染并返回响应
- 逆序执行拦截器的 afterCompletion() 方法(抛异常了也会执行)
Q:DispatcherServlet的作用? \ 它是Spring MVC的总指挥,负责请求分发、协调各组件工作。
Q:为什么需要HandlerAdapter? \ 因为处理器类型多样(Controller、HttpRequestHandler等),适配器模式让DispatcherServlet能用统一方式调用它们。
Q:拦截器三个方法的执行时机? \ preHandle在处理器前,postHandle在处理器后但视图渲染前,afterCompletion在视图渲染后。
Q:过滤器和拦截器在流程中的位置? \ 过滤器在最外层(Tomcat层面),然后才进入Spring MVC的DispatcherServlet → 拦截器 → 处理器。