spring mvc 实现原理

Spring MVC 是 Spring 框架中的一个模块,用于构建基于 MVC(Model-View-Controller)架构的 Web 应用。

Spring MVC 的系统性分析,涵盖主要组件、核心流程及关键类的作用。


🧱 一、整体架构图

Spring MVC 的请求处理流程如下:

客户端 → DispatcherServlet → HandlerMapping → Controller
                                ↓
                          ModelAndView ← 返回
                                ↓
                         ViewResolver → View
                                ↓
                           渲染 Model 数据
                                ↓
                          返回响应给客户端

其中最核心的是 DispatcherServlet,它是整个框架的前端控制器。


📦 二、核心组件及对应类

组件类名功能
前端控制器DispatcherServlet控制所有请求入口,协调各组件
处理器映射HandlerMapping 接口(如 RequestMappingHandlerMapping根据 URL 找到对应的 Controller 方法
处理器适配器HandlerAdapter 接口(如 RequestMappingHandlerAdapter调用 Controller 方法并处理参数/返回值
视图解析器ViewResolver 接口(如 InternalResourceViewResolver解析逻辑视图名为实际视图对象
异常处理器HandlerExceptionResolver 接口(如 DefaultHandlerExceptionResolver处理 Controller 抛出的异常
区域解析器LocaleResolver解析客户端区域设置
主题解析器ThemeResolver管理主题样式
Multipart 解析器MultipartResolver处理文件上传

🔍 三、核心流程源码分析

1. 请求入口:DispatcherServlet.doService()

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 设置上下文属性,包括 WebApplicationContext、localeResolver、themeResolver 等
    ...
    try {
        doDispatch(request, response); // 核心调度方法
    } finally {
        ...
    }
}

2. 核心调度逻辑:doDispatch(HttpServletRequest request, HttpServletResponse response)

这是整个请求处理的核心方法,逻辑如下:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;

    // 1. 文件上传处理
    if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
        processedRequest = this.multipartResolver.resolveMultipart(request);
    }

    // 2. 获取 Handler(Controller 方法)
    mappedHandler = getHandler(processedRequest);

    // 3. 获取 HandlerAdapter(适配不同类型的 Controller)
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

    // 4. 调用 preHandle 拦截器
    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
        return;
    }

    // 5. 实际调用 Controller 方法
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

    // 6. 处理返回的 ModelAndView
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

3. HandlerMapping 的实现类:RequestMappingHandlerMapping

负责将 URL 映射到具体的 Controller 方法上。

public class RequestMappingHandlerMapping extends AbstractHandlerMethodMapping<String> {
    // 注册所有的 @RequestMapping 注解的方法
    protected void registerHandlerMethods(Object handler, Class<?> handlerType) {
        ...
    }

    // 根据 URL 查找 HandlerMethod
    public HandlerMethod getHandlerInternal(HttpServletRequest request) {
        ...
    }
}

4. HandlerAdapter 的实现类:RequestMappingHandlerAdapter

负责调用 Controller 方法,并处理参数绑定与返回值处理。

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
    private List<HandlerMethodArgumentResolver> argumentResolvers; // 参数解析器链
    private List<HandlerMethodReturnValueHandler> returnValueHandlers; // 返回值处理器链

    public final ModelAndView handleInternal(HttpServletRequest request,
                                             HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        // 参数解析
        ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
        invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);

        // 调用 controller 方法
        Object returnValue = invocableMethod.invokeForRequest(webRequest, mavContainer, providedArgs);

        // 处理返回值
        this.returnValueHandlers.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
    }
}

5. 参数绑定机制(@RequestParam, @RequestBody 等)

Spring MVC 使用 HandlerMethodArgumentResolver 来支持各种参数类型:

参数注解对应的 Resolver
@RequestParamRequestParamMethodArgumentResolver
@PathVariablePathVariableMethodArgumentResolver
@RequestBodyRequestResponseBodyMethodProcessor
@ModelAttributeModelAttributeMethodProcessor

6. 返回值处理(@ResponseBody, ModelAndView

使用 HandlerMethodReturnValueHandler 处理 Controller 返回的数据:

返回类型对应的 Handler
ModelAndViewModelAndViewMethodReturnValueHandler
voidVoidReturnMethodHandler
@ResponseBodyRequestResponseBodyMethodProcessor
String(视图名)ViewNameMethodReturnValueHandler

7. 异常处理(@ExceptionHandler, @ControllerAdvice

Spring MVC 提供了灵活的异常处理机制:

  • @ExceptionHandler:在 Controller 内部处理异常。
  • @ControllerAdvice:全局异常处理器。
  • HandlerExceptionResolver 接口是底层抽象。

常见实现:

  • SimpleMappingExceptionResolver
  • DefaultHandlerExceptionResolver
  • ExceptionHandlerExceptionResolver(处理 @ExceptionHandler

🧪 四、调试

1. 启动时加载配置

  • 关注 WebApplicationInitializer@EnableWebMvc 的作用。
  • DispatcherServlet 的初始化过程(onRefresh() 方法中加载各个组件)。

2. 调试入口点

  • 断点设置在 DispatcherServlet.doDispatch() 方法。
  • 追踪 HandlerMapping.getHandler()HandlerAdapter.handle()

3. 使用 IDE 分析依赖关系

  • IntelliJ IDEA 中可使用 “Find Usages”、“Call Hierarchy” 分析类之间的调用关系。
  • 利用 “Structure” 面板查看类结构。

📚 五、推荐阅读源码路径

Spring MVC 源码位于 Spring Framework 项目中:

spring-webmvc/src/main/java/org/springframework/web/servlet/

重点类列表:

类名描述
DispatcherServlet主控类
HandlerMapping / AbstractHandlerMapping映射接口与抽象类
HandlerAdapter / AbstractHandlerMethodAdapter适配器接口与抽象类
RequestMappingHandlerMapping支持 @RequestMapping 的 HandlerMapping
RequestMappingHandlerAdapter支持 @RequestMapping 的 HandlerAdapter
HandlerMethodArgumentResolver参数解析接口
HandlerMethodReturnValueHandler返回值处理接口
ViewResolver / InternalResourceViewResolver视图解析相关
HandlerExceptionResolver / ExceptionHandlerExceptionResolver异常处理相关

✅ 六、总结

学习要点内容
入口DispatcherServlet 是核心控制中心
流程请求 → HandlerMapping → HandlerAdapter → Controller → 返回值处理 → View 渲染
参数绑定使用 HandlerMethodArgumentResolver 实现自动绑定
返回值处理使用 HandlerMethodReturnValueHandler 处理返回结果
异常处理支持局部和全局异常处理机制
可扩展性各组件可通过配置或自定义实现替换增强功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值