做 SpringBoot Web 开发这么久很多同学只知道写 Controller、Service却不清楚一个 HTTP 请求从发送到响应背后到底经过了哪些组件。其实 SpringBoot Web 模块的核心全围绕一个“调度中心”展开——那就是 DispatcherServlet。今天就从 DispatcherServlet 入手把 SpringBoot Web 模块的核心组件讲透包括它们的作用、执行流程还有实际开发中需要注意的细节。先给大家一个核心结论SpringBoot Web 模块的所有组件都是为了配合 DispatcherServlet 完成“请求接收→处理→响应”的全流程DispatcherServlet 就是整个 Web 模块的“总指挥”。一、先搞懂DispatcherServlet 到底是什么很多同学会把 DispatcherServlet 和普通的 Servlet 搞混其实它本质上是 Servlet 的子类是 SpringMVC 提供的核心调度器也是 SpringBoot Web 模块的入口。SpringBoot 是“约定大于配置”引入 web 依赖后会自动配置 DispatcherServlet我们可以通过一段简单代码验证它的自动配置1importorg.springframework.boot.SpringApplication; 2importorg.springframework.boot.autoconfigure.SpringBootApplication; 3importorg.springframework.web.servlet.DispatcherServlet; 4importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer; 5 6SpringBootApplication 7publicclassWebCoreApplicationimplementsWebMvcConfigurer{ 8 9publicstaticvoidmain(String[] args){ 10SpringApplication.run(WebCoreApplication.class, args); 11} 12 13// 验证 DispatcherServlet 自动配置可选仅用于测试 14// 此处代码可直接复制启动项目后控制台会打印 DispatcherServlet 相关信息 15Bean 16publicDispatcherServletdispatcherServlet(){ 17DispatcherServlet dispatcherServlet newDispatcherServlet(); 18// 打印调度器信息验证是否被 Spring 管理 19System.out.println(DispatcherServlet 自动配置成功 dispatcherServlet); 20return dispatcherServlet; 21} 22}简单说DispatcherServlet 的核心作用就是“接收所有 HTTP 请求然后分发给对应的组件处理最后把处理结果返回给前端”。它不做具体的业务逻辑只负责“调度”就像一个项目经理接收需求请求分配给对应开发组件最后交付成果响应。⚠️ 有时候我们写的 Controller 接口访问不到排除路径错误后大概率是 DispatcherServlet 没被正确自动配置比如依赖引入不全、启动类没加 SpringBootApplication 注解。二、SpringBoot Web 核心组件光有 DispatcherServlet 不够还需要一系列组件配合才能完成请求处理。这些组件都是 SpringBoot 自动配置的我们平时不用手动创建但必须懂它们的作用否则遇到问题无从下手。下面每个组件都配图文拆解实操代码确保能看懂、能复用。1. 核心组件HandlerMapping处理器映射器作用根据请求的 URL找到对应的 Controller 方法Handler。SpringBoot 中默认使用的是 RequestMappingHandlerMapping它支持 RequestMapping、GetMapping、PostMapping 等注解我们可以通过代码自定义 HandlerMapping1importorg.springframework.context.annotation.Bean; 2importorg.springframework.context.annotation.Configuration; 3importorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; 4 5Configuration 6publicclassWebConfig{ 7 8// 自定义 HandlerMapping默认已自动配置此处仅做演示 9Bean 10publicRequestMappingHandlerMappingrequestMappingHandlerMapping(){ 11RequestMappingHandlerMapping handlerMapping newRequestMappingHandlerMapping(); 12// 可设置映射规则比如前缀、拦截规则等 13 handlerMapping.setPrefix(/api);// 所有接口添加 /api 前缀 14return handlerMapping; 15} 16}补充如果我们自定义了拦截器HandlerMapping 还会把拦截器和对应的 Handler 绑定确保请求先经过拦截器再进入 Controller。2. 核心组件HandlerAdapter处理器适配器作用调用 HandlerController 方法并处理方法的参数、返回值。可能有同学会问DispatcherServlet 找到 Handler 后为什么不直接调用因为不同的 Handler 可能有不同的参数类型、返回值类型HandlerAdapter 就是用来“适配”这些差异统一调用方式。SpringBoot 中默认使用的是 RequestMappingHandlerAdapter我们可以通过代码验证它的作用比如自定义参数解析1importorg.springframework.context.annotation.Bean; 2importorg.springframework.context.annotation.Configuration; 3importorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; 4 5Configuration 6publicclassWebConfig{ 7 8// 验证 HandlerAdapter 的作用自定义参数解析简化版 9Bean 10publicRequestMappingHandlerAdapterrequestMappingHandlerAdapter(){ 11RequestMappingHandlerAdapter adapter newRequestMappingHandlerAdapter(); 12// 此处可添加自定义参数解析器比如解析自定义注解参数 13System.out.println(HandlerAdapter 初始化完成负责参数解析和方法调用); 14return adapter; 15} 16}⚠️ 如果 Controller 方法的参数绑定失败比如 RequestBody 对应的 JSON 格式错误就是 HandlerAdapter 解析失败会返回 400 错误。3. 核心组件HandlerExceptionResolver异常处理器作用处理请求过程中出现的异常比如 Controller 方法抛出的异常、拦截器抛出的异常避免直接返回错误页面统一返回格式。这就是我们之前讲的“全局异常处理”的底层原理——我们自定义的 RestControllerAdvice 全局异常处理器本质上就是实现了 HandlerExceptionResolver 接口1importorg.springframework.web.bind.annotation.ExceptionHandler; 2importorg.springframework.web.bind.annotation.RestControllerAdvice; 3 4// 自定义全局异常处理器实现 HandlerExceptionResolver 功能Spring 自动识别 5RestControllerAdvice 6publicclassGlobalExceptionHandler{ 7 8// 处理所有未捕获的异常 9ExceptionHandler(Exception.class) 10publicResult?handleException(Exception e){ 11 e.printStackTrace(); 12returnResult.fail(500,服务器异常 e.getMessage()); 13} 14 15// 处理参数绑定异常HandlerAdapter 解析失败时触发 16ExceptionHandler(IllegalArgumentException.class) 17publicResult?handleIllegalArgumentException(IllegalArgumentException e){ 18returnResult.fail(400,参数错误 e.getMessage()); 19} 20}4. 核心组件ViewResolver视图解析器作用把 Controller 方法返回的视图名称解析成具体的视图比如 HTML 页面。注意前后端分离项目中我们的 Controller 方法一般返回 JSON用 ResponseBody 注解所以 ViewResolver 基本用不到但如果是传统的 JSP 项目ViewResolver 就很重要代码示例如下1importorg.springframework.context.annotation.Bean; 2importorg.springframework.context.annotation.Configuration; 3importorg.springframework.web.servlet.view.InternalResourceViewResolver; 4 5Configuration 6publicclassWebConfig{ 7 8// 传统 JSP 项目配置 ViewResolver 9Bean 10publicInternalResourceViewResolverviewResolver(){ 11InternalResourceViewResolver viewResolver newInternalResourceViewResolver(); 12// 设置视图前缀和后缀解析视图名称 13 viewResolver.setPrefix(/WEB-INF/jsp/); 14 viewResolver.setSuffix(.jsp); 15return viewResolver; 16} 17}SpringBoot 中默认的 ViewResolver 是 InternalResourceViewResolver适合传统 JSP 项目前后端分离项目中我们可以忽略它专注于 JSON 返回即可。5. 核心组件HttpMessageConverter消息转换器作用实现“请求体→Java 对象”和“Java 对象→响应体”的转换也就是我们之前讲的 JSON 格式化、日期格式化的底层组件。我们之前自定义的全局日期格式化、Long 转 String都是通过配置 HttpMessageConverterMappingJackson2HttpMessageConverter实现的1importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer; 2importcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 3importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; 4importorg.springframework.context.annotation.Bean; 5importorg.springframework.context.annotation.Configuration; 6importorg.springframework.http.converter.HttpMessageConverter; 7importorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 8importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer; 9 10importjava.time.LocalDateTime; 11importjava.time.format.DateTimeFormatter; 12importjava.util.List; 13 14Configuration 15publicclassWebConfigimplementsWebMvcConfigurer{ 16 17// 全局日期格式 18privatestaticfinalStringDEFAULT_DATE_TIME_FORMATyyyy-MM-dd HH:mm:ss; 19 20// 自定义 HttpMessageConverter实现全局 JSON 格式化 21Override 22publicvoidconfigureMessageConverters(ListHttpMessageConverter? converters){ 23 converters.add(jsonConverter()); 24} 25 26Bean 27publicMappingJackson2HttpMessageConverterjsonConverter(){ 28MappingJackson2HttpMessageConverter converter newMappingJackson2HttpMessageConverter(); 29com.fasterxml.jackson.databind.ObjectMapper objectMapper newcom.fasterxml.jackson.databind.ObjectMapper(); 30 31// 1. 全局日期格式化 32JavaTimeModule timeModule newJavaTimeModule(); 33 timeModule.addSerializer(LocalDateTime.class, 34newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT))); 35 36// 2. Long 转 String解决前端 JS 精度丢失 37com.fasterxml.jackson.databind.module.SimpleModule longModule newcom.fasterxml.jackson.databind.module.SimpleModule(); 38 longModule.addSerializer(Long.class,ToStringSerializer.instance); 39 longModule.addSerializer(Long.TYPE,ToStringSerializer.instance); 40 41// 注册模块 42 objectMapper.registerModule(timeModule); 43 objectMapper.registerModule(longModule); 44 45 converter.setObjectMapper(objectMapper); 46return converter; 47} 48}三、HTTP 请求完整执行链路理解了核心组件再看整个请求链路就非常清晰了这也是面试常问的知识点结合图文和步骤不用死背前端发送 HTTP 请求比如 GET /user/1请求先到达 Tomcat 容器Tomcat 把请求转发给 SpringBoot 的 DispatcherServlet所有请求都会经过它DispatcherServlet 调用 HandlerMapping根据请求 URL 找到对应的 Controller 方法HandlerDispatcherServlet 调用 HandlerAdapter由 HandlerAdapter 调用找到的 Controller 方法处理业务逻辑调用 Service、MapperController 方法返回结果Java 对象/视图名称HandlerAdapter 把结果返回给 DispatcherServlet如果返回的是 Java 对象前后端分离DispatcherServlet 调用 HttpMessageConverter把 Java 对象转换成 JSON 字符串如果返回的是视图名称传统项目DispatcherServlet 调用 ViewResolver解析成具体视图如果请求过程中出现异常HandlerExceptionResolver 会捕获异常处理后返回统一格式DispatcherServlet 把最终的响应结果JSON/视图返回给 Tomcat再由 Tomcat 返回给前端完成整个流程。一句话总结所有请求都绕不开 DispatcherServlet它串联起所有核心组件完成请求的调度和处理。四、实际开发注意事项DispatcherServlet 自动配置SpringBoot 引入 spring-boot-starter-web 依赖后会自动配置 DispatcherServlet默认映射所有 URL/*不用手动配置组件自定义如果默认的组件不满足需求比如自定义日期格式化、自定义异常处理可以通过配置类重写对应的组件比如自定义 HttpMessageConverter、自定义 HandlerExceptionResolver请求拦截我们之前讲的 Filter过滤器是在 Tomcat 层面拦截请求早于 DispatcherServletInterceptor拦截器是在 DispatcherServlet 之后、Controller 之前拦截两者顺序不要搞混参数解析失败如果 Controller 方法参数绑定失败检查 HttpMessageConverter 配置比如 JSON 格式错误、参数类型不匹配。五、最后总结SpringBoot Web 模块的核心就是以 DispatcherServlet 为调度中心配合 HandlerMapping、HandlerAdapter、HttpMessageConverter 等组件完成 HTTP 请求的接收、处理和响应。我们日常开发中写 Controller、自定义全局异常、配置 JSON 格式化本质上都是在围绕这些核心组件做扩展。懂了这些组件的作用和执行链路不仅能解决日常开发中的问题面试时也能从容应对相关问题。