dispatcherservlet 是 spring mvc 的前端控制器,负责请求分发而非业务处理;它作为标准 servlet 在容器启动时初始化,加载 webapplicationcontext 并配置九大组件,再按查找 handler、选择适配器、执行拦截器、解析视图、渲染响应五步完成请求处理。

Spring MVC 的请求分发核心就是 DispatcherServlet,它是一个前端控制器(Front Controller),不处理具体业务逻辑,而是协调整个请求生命周期的流转。它的本质是 一个标准的 Servlet,在 Web 容器(如 Tomcat)启动时被初始化,并拦截匹配的 HTTP 请求(通常配置为 / 或 /*.do 等)。
DispatcherServlet 的初始化与请求入口
当 Web 应用启动,容器读取 web.xml(或基于 Java Config 的 ServletRegistrationBean)后,会创建并调用 DispatcherServlet.init()。此时它会:
- 加载并刷新关联的 Spring WebApplicationContext(即“Web 上下文”,通常继承自根上下文)
- 从上下文中获取预定义的九大组件(如
HandlerMapping、HandlerAdapter、ViewResolver等),若未显式配置,则使用默认实现(如RequestMappingHandlerMapping、RequestMappingHandlerAdapter) - 完成初始化后,就准备好接收和分发请求
一次典型请求的分发流程
用户发起 HTTP 请求(例如 GET /user/123)后,DispatcherServlet.doDispatch() 被触发,按顺序执行以下关键步骤:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
查找 Handler:遍历所有
HandlerMapping(如RequestMappingHandlerMapping),根据请求 URL、HTTP 方法、参数等匹配到对应的@Controller中的处理方法(即HandlerMethod) -
选择适配器:用
HandlerAdapter(如RequestMappingHandlerAdapter)判断该 Handler 是否支持,并调用其handle()方法执行业务逻辑 -
执行拦截器:在 Handler 执行前后,触发已注册的
HandlerInterceptor的preHandle()、afterCompletion()等方法 -
解析视图:Handler 返回
ModelAndView(或 String、void、ResponseEntity 等),由ViewResolver将逻辑视图名(如"user/detail")解析为实际视图对象(如InternalResourceView对应 JSP) -
渲染响应:调用视图的
render()方法,将模型数据写入 HTTP 响应(如填充 JSP、生成 JSON)
关键组件如何协作(以注解驱动为例)
现代 Spring MVC 默认启用注解驱动(<annotation-driven></annotation-driven> 或 @EnableWebMvc),主要组件协同方式如下:
-
RequestMappingHandlerMapping:扫描所有@Controller和@RequestMapping(含派生注解如@GetMapping),构建 URL 到HandlerMethod的映射关系表 -
RequestMappingHandlerAdapter:负责解析方法参数(如@PathVariable、@RequestBody)、处理返回值(如@ResponseBody自动转 JSON)、调用目标方法 -
ExceptionHandlerExceptionResolver:捕获 Controller 抛出的异常,委托@ExceptionHandler方法处理,统一错误响应 -
HttpMessageConverter:支撑 REST 风格交互,在请求体与 Java 对象(如 JSON ↔ User)之间双向转换
自定义分发行为的常见方式
若需干预默认流程,可通过以下方式扩展:
- 实现
HandlerInterceptor并注册,用于日志、权限校验、性能统计等横切逻辑 - 自定义
HandlerMapping(较少见),比如按请求头或用户角色动态路由到不同 Controller - 重写
WebMvcConfigurer中的方法,如addArgumentResolvers()添加自定义参数解析器,configureMessageConverters()替换 JSON 处理器 - 提供自己的
ViewResolver实现,支持模板引擎(如 Thymeleaf、FreeMarker)或自定义视图格式
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










