1、参数解析器
1.1、“带@ModelAttribute注解或者带@RequestMapping注解的方法”默认参数解析器:
默认“带@ModelAttribute注解或者带@RequestMapping注解的方法”参数解析器:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.getDefaultArgumentResolvers()
{
List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
// Annotation-based argument resolution
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false)); // 参数上有@RequestParam注解,且是普通类型
resolvers.add(new RequestParamMapMethodArgumentResolver()); // 参数上有@RequestParam注解,且是map类型
resolvers.add(new PathVariableMethodArgumentResolver()); // 参数上有@PathVariable注解,且是普通类型
resolvers.add(new PathVariableMapMethodArgumentResolver()); // 参数上有@PathVariable注解,且是map类型
resolvers.add(new MatrixVariableMethodArgumentResolver()); // 参数上有@MatrixVariable注解,且是普通类型
resolvers.add(new MatrixVariableMapMethodArgumentResolver()); // 参数上有@MatrixVariable注解,且是map类型
resolvers.add(new ServletModelAttributeMethodProcessor(false)); // !!! 需要@ModelAttribute注解,尝试获取顺序:1、UriTemplateVariables 2、request.getParameter(attributeName)
resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); // !!! 参数上有@RequestBody注解、返回值上有@ResponseBody注解
resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice)); // 参数上有@RequestPart注解、或者MultipartFile类型
resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory())); // 参数上有@RequestHeader注解,且是普通类型
resolvers.add(new RequestHeaderMapMethodArgumentResolver()); // 参数上有@RequestHeader注解,且是map类型
resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory())); // 参数上有@CookieValue注解
resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory())); // 参数上有@Value注解
resolvers.add(new SessionAttributeMethodArgumentResolver()); // 参数上有@SessionAttribute注解
resolvers.add(new RequestAttributeMethodArgumentResolver()); // 参数上有@RequestAttribute注解
// Type-based argument resolution
resolvers.add(new ServletRequestMethodArgumentResolver()); // javax.servlet.ServletRequest等类型的参数
resolvers.add(new ServletResponseMethodArgumentResolver()); // javax.servlet.ServletResponse等类型的参数
resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); // 参数类型是 HttpEntity 或者 RequestEntity
resolvers.add(new RedirectAttributesMethodArgumentResolver()); // 参数类型是RedirectAttributes的子类
resolvers.add(new ModelMethodProcessor()); // 参数类型是Model的子类
resolvers.add(new MapMethodProcessor()); // 参数类型是Map的子类
resolvers.add(new ErrorsMethodArgumentResolver()); // 参数类型是Errors的子类,处理“校验结果”参数注入 org.springframework.validation.BindingResult
resolvers.add(new SessionStatusMethodArgumentResolver()); // 参数类型是SessionStatus
resolvers.add(new UriComponentsBuilderMethodArgumentResolver()); // 参数类型是UriComponentsBuilder、ServletUriComponentsBuilder
// Custom arguments
if (getCustomArgumentResolvers() != null) { // 自定义参数值处理器
resolvers.addAll(getCustomArgumentResolvers());
}
// Catch-all
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); // 参数上有@RequestParam注解、或MultipartFile类型
resolvers.add(new ServletModelAttributeMethodProcessor(true)); // !!!! 不需要@ModelAttribute注解,尝试获取顺序:1、UriTemplateVariables 2、request.getParameter(attributeName) 3、自定义类型UserLoginForm
return resolvers;
}
1.2、“带@InitBinder注解的方法”默认参数解析器:
默认“带@InitBinder注解的方法”参数解析器:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.getDefaultInitBinderArgumentResolvers()
{
List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
// Annotation-based argument resolution
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
resolvers.add(new RequestParamMapMethodArgumentResolver());
resolvers.add(new PathVariableMethodArgumentResolver());
resolvers.add(new PathVariableMapMethodArgumentResolver());
resolvers.add(new MatrixVariableMethodArgumentResolver());
resolvers.add(new MatrixVariableMapMethodArgumentResolver());
resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
resolvers.add(new SessionAttributeMethodArgumentResolver());
resolvers.add(new RequestAttributeMethodArgumentResolver());
// Type-based argument resolution
resolvers.add(new ServletRequestMethodArgumentResolver());
resolvers.add(new ServletResponseMethodArgumentResolver());
// Custom arguments
if (getCustomArgumentResolvers() != null) {
resolvers.addAll(getCustomArgumentResolvers());
}
// Catch-all
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));
return resolvers;
}
------
使用参数解析器:
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(...)
1.3、调用方式
1、检查是否支持
2、进行解析
if (this.argumentResolvers.supportsParameter(parameter)) {
try {
args[i] = this.argumentResolvers.resolveArgument(
parameter, mavContainer, request, this.dataBinderFactory);
continue;
}
catch (Exception ex) {
if (logger.isDebugEnabled()) {
logger.debug(getArgumentResolutionErrorMessage("Failed to resolve", i), ex);
}
throw ex;
}
}
2、返回值解析器
2.1、解析器
默认“返回值”解析器:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.getDefaultReturnValueHandlers()
{
List<HandlerMethodReturnValueHandler> handlers = new ArrayList<HandlerMethodReturnValueHandler>();
// Single-purpose return value types
handlers.add(new ModelAndViewMethodReturnValueHandler()); // 返回值是ModelAndView类型或者子类
handlers.add(new ModelMethodProcessor()); // 返回值类型是Model类型或者子类
handlers.add(new ViewMethodReturnValueHandler()); // 返回值类型是View类型或者子类
handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters())); // 返回值类型是ResponseEntity类型或者子类
handlers.add(new StreamingResponseBodyReturnValueHandler()); // 返回值类型是StreamingResponseBody类型或者子类
handlers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice)); // 返回值类型是HttpEntity类型或者子类
handlers.add(new HttpHeadersReturnValueHandler()); // 返回值类型是HttpHeaders类型或者子类
handlers.add(new CallableMethodReturnValueHandler()); // 返回值类型是Callable类型或者子类
handlers.add(new DeferredResultMethodReturnValueHandler()); // 返回值类型是DeferredResult、ListenableFuture或者子类
handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory)); // 返回值类型是WebAsyncTask类型或者子类
// Annotation-based return value types
handlers.add(new ModelAttributeMethodProcessor(false)); // 返回值上有@ModelAttribute注解
handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.contentNegotiationManager, this.requestResponseBodyAdvice)); // 返回值上有 @ResponseBody注解
// Multi-purpose return value types
handlers.add(new ViewNameMethodReturnValueHandler()); // 返回void或者字符串
handlers.add(new MapMethodProcessor()); // 返回值类型是Map类型
// Custom return value types
if (getCustomReturnValueHandlers() != null) { // 自定义返回值处理器
handlers.addAll(getCustomReturnValueHandlers());
}
// Catch-all
if (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {
handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));
}
else {
handlers.add(new ModelAttributeMethodProcessor(true)); // 返回值上有@ModelAttribute注解
}
return handlers;
}
------
使用“返回值”解析器:
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(...)
2.2、调用方式
1、检查是否支持
2、进行解析
if (handler.supportsReturnType(returnType)) {
return handler;
}
handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
3、整体流程
1、调用带 @ModelAttribute 注解的方法列表,初始化模型
1、解析方法调用参数
2、处理方法返回参数
3、设置到 ModelAndViewContainer 容器
2、调用带 @RequestMapping 注解的方法
1、解析方法调用参数
1、参数1
1、类型解析器 - 参数上含有 @RequestParam 注解
2、类型解析器 - 参数上含有 @ModelAttribute 注解
1、从 ModelAndViewContainer 容器获取《目标参数对象》
2、《目标参数对象》未实例化,那么创建《目标参数对象》
3、迭代调用带有 @InitBinder 注解的方法,对《目标参数对象》进行初始化 --- @InitBinder 注解的方法不能有返回值
4、绑定数据到目标对象
3、其他类型解析器
3、其他参数。。。
2、处理方法返回参数
1、类型解析器