全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

HandlerAdapter调用链

HandlerAdapter是SpringMVC的适配器组件,负责调用不同类型的Handler并处理返回结果。

核心接口定义

Java
public interface HandlerAdapter {
    boolean supports(Object handler);

    @Nullable
    ModelAndView handle(HttpServletRequest request,
                        HttpServletResponse response,
                        Object handler) throws Exception;

    long getLastModified(HttpServletRequest request, Object handler);
}

主要适配器类型

适配器支持的Handler类型说明
RequestMappingHandlerAdapterHandlerMethod处理@RequestMapping方法
HttpRequestHandlerAdapterHttpRequestHandler处理静态资源请求
SimpleControllerHandlerAdapterController处理传统Controller

RequestMappingHandlerAdapter核心流程

1. 参数解析

Java
public ModelAndView handleInternal(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) {
    // 获取方法参数
    Object[] args = getMethodArgumentValues(request, response, handlerMethod);
    // 调用Handler方法
    Object returnValue = invokeHandlerMethod(request, response, handlerMethod, args);
    // 处理返回值
    return handleReturnValue(returnValue, handlerMethod);
}

2. 参数解析器链

Java
private HandlerMethodArgumentResolverComposite getArgumentResolvers() {
    List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
    // 添加默认参数解析器
    resolvers.add(new RequestParamMethodArgumentResolver());
    resolvers.add(new RequestHeaderMethodArgumentResolver());
    resolvers.add(new RequestBodyMethodArgumentResolver());
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    // ... 更多解析器
    return new HandlerMethodArgumentResolverComposite().addResolvers(resolvers);
}

3. 返回值处理器链

Java
private HandlerMethodReturnValueHandlerComposite getReturnValueHandlers() {
    List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>();
    handlers.add(new ModelAndViewMethodReturnValueHandler());
    handlers.add(new ViewNameMethodReturnValueHandler());
    handlers.add(new ResponseBodyMethodReturnValueHandler());
    handlers.add(new RequestResponseBodyMethodProcessor());
    // ... 更多处理器
    return new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
}

调用链执行流程

Java
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
        HttpServletResponse response, HandlerMethod handlerMethod) {

    // 创建方法调用器
    ServletInvocableHandlerMethod invocableMethod =
        createInvocableHandlerMethod(handlerMethod);

    // 设置参数解析器
    invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);

    // 设置返回值处理器
    invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);

    // 执行调用
    invocableMethod.invokeAndHandle(webRequest, mavContainer);

    return getModelAndView(mavContainer, model, webRequest);
}

参数解析流程

Java
protected Object[] getMethodArgumentValues(NativeWebRequest request,
        ModelAndViewContainer mavContainer, Object... providedArgs) {

    MethodParameter[] parameters = getMethodParameters();
    Object[] args = new Object[parameters.length];

    for (int i = 0; i < parameters.length; i++) {
        MethodParameter parameter = parameters[i];
        // 查找支持的解析器
        HandlerMethodArgumentResolver resolver =
            getArgumentResolver(parameter);
        if (resolver == null) {
            throw new IllegalArgumentException("Unsupported parameter type");
        }
        // 解析参数值
        args[i] = resolver.resolveArgument(parameter, mavContainer,
                                           request, this.dataBinderFactory);
    }
    return args;
}

返回值处理流程

Java
public void handleReturnValue(Object returnValue, MethodParameter returnType,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest) {

    // 查找支持的处理器
    HandlerMethodReturnValueHandler handler =
        selectHandler(returnValue, returnType);

    if (handler == null) {
        throw new IllegalArgumentException("Unknown return value type");
    }

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

WebDataBinder绑定

Java
// 参数解析时触发数据绑定
public final Object resolveArgument(MethodParameter parameter,
        ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
        WebDataBinderFactory binderFactory) {

    // 创建DataBinder
    WebDataBinder binder = binderFactory.createBinder(webRequest, null, parameter.getParameterName());

    // 执行绑定
    if (binder.getTarget() != null) {
        bindRequestParameters(binder, webRequest);
        validateIfApplicable(binder, parameter);
    }

    return binder.getTarget();
}

HandlerAdapter通过责任链模式协调多个参数解析器和返回值处理器,实现灵活的请求处理。

要点总结

  1. HandlerAdapter采用适配器模式统一不同Handler的调用方式
  2. 参数解析器链负责将请求数据绑定到方法参数
  3. 返回值处理器链负责处理Handler方法的返回结果
  4. WebDataBinder负责数据绑定和校验
  5. 整个调用链支持高度扩展,可自定义解析器和处理器

jwdev/articles/SPRINGMVC/专家/MVC核心源码执行流程/MVC核心源码执行流程/HandlerAdapter调用链.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 DispatcherServlet初始化流程
下一篇 → HandlerMapping机制
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库