面试官:Spring MVC的执行流程是怎样的?

简介: 面试官:Spring MVC的执行流程是怎样的?

小熊学Java网站:https://javaxiaobear.cn/,每周持续更新干货,建议收藏!

把整个流程分成三个阶段:准备阶段——> 匹配阶段——>执行阶段

准备阶段

  1. 在 Web 容器第一次用到 DispatcherServlet 的时候,会创建其对象并执行 init 方法
  2. init 方法内会创建 Spring Web 容器,并调用容器 refresh 方法
  3. refresh 过程中会创建并初始化 SpringMVC 中的重要组件, 例如 MultipartResolver,HandlerMapping,HandlerAdapter,HandlerExceptionResolver、ViewResolver 等
    DispatcherServlet源码分析
protected void onRefresh(ApplicationContext context) {
     this.initStrategies(context);
 }
 protected void initStrategies(ApplicationContext context) {
     //初始化多部 请求解析器,没有默认的实现
     this.initMultipartResolver(context);
     //初始化地域解析器,默认的实现为AcceptHeaderLocaleResolver
     this.initLocaleResolver(context);
     //初始化主题解析器,默认的实现为FixedThemeResolver
     this.initThemeResolver(context);
     //初始化处理器映射器,这是一个集合,默认的实现为 BeanNameUrlHandlerMapping
     this.initHandlerMappings(context);
     //初始化处理器适配器,这也是一个集合,默认的实现有HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter
     this.initHandlerAdapters(context);
     //初始化异常解析器,也是一个集合
     this.initHandlerExceptionResolvers(context);
     //初始化请求到视图名解析器,默认的实现为DefaultRequestToViewNameTranslator
     this.initRequestToViewNameTranslator(context);
     //初始化视图解析器,也是一个集合,InternalResourceViewResolver
     this.initViewResolvers(context);
     this.initFlashMapManager(context);
 }
  1. 容器初始化后,会将上一步初始化好的重要组件,赋值给 DispatcherServlet 的成员变量,留待后用

匹配阶段

  1. 用户发送的请求统一到达前端控制器 DispatcherServlet

  2. DispatcherServlet 遍历所有 HandlerMapping ,找到与路径匹配的处理器
    ① HandlerMapping 有多个,每个 HandlerMapping 会返回不同的处理器对象,谁先匹配,返回谁的处理器。其中能识别 @RequestMapping 的优先级最高
    ② 对应 @RequestMapping 的处理器是 HandlerMethod,它包含了控制器对象和控制器方法信息
    ③ 其中路径与处理器的映射关系在 HandlerMapping 初始化时就会建立好

  3. 将 HandlerMethod 连同匹配到的拦截器,生成调用链对象 HandlerExecutionChain 返回

  1. 遍历HandlerAdapter 处理器适配器,找到能处理 HandlerMethod 的适配器对象,开始调用

调用阶段

  1. 执行拦截器 preHandle

  1. 由 HandlerAdapter 调用 HandlerMethod
    ① 调用前处理不同类型的参数
    ② 调用后处理不同类型的返回值


  1. 第 2 步没有异常
    ① 返回 ModelAndView
    ② 执行拦截器 postHandle 方法
    ③ 解析视图,得到 View 对象,进行视图渲染

  2. 第 2 步有异常,进入 HandlerExceptionResolver 异常处理流程

  1. 最后都会执行拦截器的 afterCompletion 方法
  2. 如果控制器方法标注了 @ResponseBody 注解,则在第 2 步,就会生成 json 结果,并标记 ModelAndView 已处理,这样就不会执行第 3 步的视图渲染

好了,本文就到这里了!如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻




相关文章
|
1天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
20 6
|
1天前
|
JSON 前端开发 Java
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解(下)
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解
6 0
|
1天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
45 3
|
1天前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
17 2
|
1天前
|
设计模式 前端开发 Java
初识Spring MVC
初识Spring MVC
13 0
|
1天前
|
前端开发 Java 应用服务中间件
Spring MVC框架概述
Spring MVC 是一个基于Java的轻量级Web框架,采用MVC设计模型实现请求驱动的松耦合应用开发。框架包括DispatcherServlet、HandlerMapping、Handler、HandlerAdapter、ViewResolver核心组件。DispatcherServlet协调这些组件处理HTTP请求和响应,Controller处理业务逻辑,Model封装数据,View负责渲染。通过注解@Controller、@RequestMapping等简化开发,支持RESTful请求。Spring MVC具有清晰的角色分配、Spring框架集成、多种视图技术支持以及异常处理等优点。
16 1
|
1天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
15 0
|
1天前
|
监控 前端开发 Java
SpringBoot与SpringMVC有哪些区别?
SpringBoot和SpringMVC是Java开发中常用的两个框架,它们都是由Spring框架所提供的,但在功能和使用方式上有着一些区别。
23 2
|
1天前
|
SQL Java 数据库连接
这些年背过的面试题——Spring篇
对技术人来说,面试成功的道路只有一条,就是好好准备技术基础。本文是面试系列文章Spring篇,作者把自己的八股文和一些经验总结汇总在一起,供大家参考。
|
1天前
|
数据采集 前端开发 Java
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
数据塑造:Spring MVC中@ModelAttribute的高级数据预处理技巧
23 3