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类型 | 说明 |
|---|---|---|
| RequestMappingHandlerAdapter | HandlerMethod | 处理@RequestMapping方法 |
| HttpRequestHandlerAdapter | HttpRequestHandler | 处理静态资源请求 |
| SimpleControllerHandlerAdapter | Controller | 处理传统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通过责任链模式协调多个参数解析器和返回值处理器,实现灵活的请求处理。
要点总结
- HandlerAdapter采用适配器模式统一不同Handler的调用方式
- 参数解析器链负责将请求数据绑定到方法参数
- 返回值处理器链负责处理Handler方法的返回结果
- WebDataBinder负责数据绑定和校验
- 整个调用链支持高度扩展,可自定义解析器和处理器
jwdev/articles/SPRINGMVC/专家/MVC核心源码执行流程/MVC核心源码执行流程/HandlerAdapter调用链.md
📝 发现内容有误?点击此处直接编辑