spring boot 1.5.3 源代码片段 - webmvc - handler适配器RequestMappingHandlerAdapter

37 篇文章 0 订阅
18 篇文章 0 订阅

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、类型解析器
			

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值