当前位置: 首页 > news >正文

spring boot 请求分发器

请求分发器(Request Dispatcher)的核心机制是由 DispatcherServlet 实现的。它是整个 Spring Web MVC 框架的前端控制器(Front Controller),负责接收所有 HTTP 请求,并将其分发(dispatch)给合适的处理器(Handler,通常是 @Controller 中的方法)。

一、什么是 DispatcherServlet

DispatcherServlet 是 Spring MVC 的核心类,继承自 HttpServlet,实现了请求的统一入口和分发逻辑。

  • 在 Spring Boot 中,无需手动配置 web.xmlDispatcherServlet 会自动注册(默认路径为 /)。
  • 所有进入应用的 HTTP 请求(除静态资源等被排除的)都会经过它。

二、请求分发的完整流程(9 步)

当一个 HTTP 请求到达 Spring Boot 应用时,DispatcherServlet 按以下顺序处理:

1. 接收请求

  • 容器(如 Tomcat)将请求交给 DispatcherServlet.service() 方法。

2. 调用 doDispatch()

  • 核心分发方法,协调后续所有组件。

3. 查找 Handler(处理器)

  • 使用 HandlerMapping 接口的实现类(如 RequestMappingHandlerMapping)。
  • 根据 URL、HTTP 方法等匹配到对应的 @Controller 中的 @RequestMapping 方法。
  • 返回一个 HandlerExecutionChain(包含目标方法 + 拦截器)。
// 示例:/api/user → UserController.getUser()

4. 查找 HandlerAdapter(处理器适配器)

  • 使用 HandlerAdapter(如 RequestMappingHandlerAdapter)。
  • 负责调用目标方法(支持参数解析、数据绑定、验证等)。

5. 执行拦截器的 preHandle()

  • 如果配置了 HandlerInterceptor,会先执行 preHandle()
  • 返回 false 则中断流程。

6. 调用目标 Controller 方法

  • HandlerAdapter 反射调用你的 @GetMapping / @PostMapping 方法。
  • 自动完成:
    • 参数解析(@PathVariable@RequestBody@RequestParam 等)
    • 数据绑定(表单 → Java 对象)
    • 验证(@Valid
    • 返回值处理

7. 处理返回值(ModelAndView / ResponseEntity / String 等)

  • 由 HandlerMethodReturnValueHandler 处理返回值。
  • 决定是渲染视图(Thymeleaf)还是写入响应体(JSON)。

8. 执行拦截器的 postHandle()

  • 在视图渲染前执行(对 @ResponseBody 无效,因为无视图)。

9. 渲染视图 或 写入响应体

  • 如果返回的是视图名(如 "home"):
    • 使用 ViewResolver(如 ThymeleafViewResolver)解析模板。
    • 渲染 HTML 并写入 HttpServletResponse
  • 如果是 @RestController 或 @ResponseBody
    • 使用 HttpMessageConverter(如 Jackson2ObjectMapper)将对象转为 JSON。
    • 直接写入响应体(response.getWriter().write(json))。

10. 执行拦截器的 afterCompletion()

  • 无论成功或异常,最终都会执行(类似 finally)。

⚠️ 注意:对于 @ResponseBodyResponseEntity没有视图渲染阶段,直接写入响应。


三、关键组件一览

组件作用常见实现
DispatcherServlet前端控制器,总调度Spring 内置
HandlerMapping根据 URL 找到处理器RequestMappingHandlerMapping
HandlerAdapter调用处理器方法RequestMappingHandlerAdapter
HandlerInterceptor拦截请求(类似 AOP)自定义实现
ViewResolver解析视图名 → View 对象ThymeleafViewResolver
HttpMessageConverter对象 ↔ JSON/XML 等MappingJackson2HttpMessageConverter

四、Spring Boot 中的自动配置

Spring Boot 通过 WebMvcAutoConfiguration 自动配置了上述所有组件:

  • 自动注册 DispatcherServlet(路径 /
  • 自动启用 @EnableWebMvc 的大部分功能(但不完全等同)
  • 自动配置 JSON 转换器(Jackson)、静态资源处理、拦截器支持等

你也可以通过以下方式自定义:

1. 添加拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**");}
}

2. 自定义消息转换器

@Bean
public HttpMessageConverters customConverters() {// 添加自定义 converter
}

3. 修改 DispatcherServlet 路径(不推荐)

# application.properties
server.servlet.context-path=/app
spring.mvc.servlet.path=/mvc/*

五、请求分发示意图

HTTP Request↓
[DispatcherServlet]↓
[HandlerMapping] → 找到 @Controller 方法↓
[HandlerAdapter] → 调用方法(参数解析、验证等)↓
[ReturnValueHandler] → 处理返回值↓├── 若为视图名 → [ViewResolver] → 渲染 HTML└── 若为 @ResponseBody → [HttpMessageConverter] → 写 JSON 到响应↓
HTTP Response

六、常见问题

Q1:为什么我的 Controller 方法没被调用?

  • 检查 @Controller / @RestController 是否标注
  • 检查 @RequestMapping 路径是否匹配
  • 检查是否被 @ComponentScan 扫描到

Q2:如何调试请求分发过程?

  • 开启日志:
    logging.level.org.springframework.web=DEBUG
  • 查看 DispatcherServlet 的 debug 输出

Q3:静态资源(如 /js/app.js)会被分发吗?

  • 不会。Spring Boot 默认通过 ResourceHttpRequestHandler 处理 /static/public/resources 等路径,绕过 Controller

简单理解

 初学者记住这 3 句话:

  1. 所有请求先到 DispatcherServlet(迎宾员),它是总指挥。
  2. 它根据 URL 找到对应的 @Controller 方法(厨师)来处理。
  3. 处理完的结果,自动变成 JSON 或网页返回给你,你不用操心怎么“送回去”。

举个代码例子

@RestController
public class OrderController {@GetMapping("/order/chicken")public String orderChicken() {return "宫保鸡丁已下单!"; // 自动变成 JSON 字符串返回}
}

当你在浏览器访问:http://localhost:8080/order/chicken
→ 就像在餐厅点菜,Spring Boot 自动完成所有分发流程,返回文字给你。

http://www.dtcms.com/a/572658.html

相关文章:

  • 百度站长收录入口如何判断网站好坏
  • RVO和移动语义
  • 阻塞队列 BlockingQueue 全解析:从 ArrayBlockingQueue 到 LinkedBlockingQueue
  • Autoware.universe多点导航和避障绕障设置
  • 计网6.1 网络应用模型
  • YOLO系列算法学习:YOLOv8:系列又一力作
  • 自动化测试-YAML
  • UnityGLTF 材质创建与赋值流程
  • 专业英文网站建设外贸业务怎么利用网站开发客户
  • 泰州网站建设策划做棋牌网站合法
  • uniapp开发ai对话app,使用百度语音识别用户输入内容并展示到页面上
  • 【XR技术介绍】Inside-Out Tracking:为何成为主流?核心技术:视觉SLAM原理通俗解读
  • Vue3 项目 GitLab CI/CD 自动构建并推送到 Harbor 教程
  • 【XR硬件系列】夸克 AI 眼镜预售背后:阿里用 “硬件尖刀 + 生态护城河“ 重构智能穿戴逻辑
  • 怎么查网站关键词排名个人网站设计企业
  • 金融机构如何用企业微信实现客户服务优化?
  • MD5 + SHA-1 详解
  • [Dify 实战] 对接飞书、企业微信等聊天系统的最佳实践与策略
  • Spring MVC 响应处理:页面、数据与状态配置详解
  • 图解 MySQL JOIN
  • 数据结构知识掌握
  • 利用MLPack插件在DuckDB中机器学习
  • 做电子书的网站很有名后来被关闭了东营市建设局官网
  • 企业微信可信IP配置的Python完美解决方案
  • 卫朋:IPD如何实现战略解码?三步翻译术
  • 德州市市长朱开国率队到访深兰科技,加速推进机器人产业落地与合作深化
  • Redis中的分布式锁
  • JVM核心知识整理《1》
  • 可以上传数据的网站开发图书页面设计模板
  • 09.MCP协议介绍