SpringMVC源码剖析之参数解析器处理handler参数流程

准备

在这里插入图片描述
在这里插入图片描述

我们之前分析过通过handlerMapping获取到了handler以及对应的所有拦截器,在通过handlerAdapter找到匹配的handlerAdapter处理handler方法

1、通过handlerAdapter 调用 handler方法,最终返回modelAndVIew,如果返回json对象给前端,那么MAV为null

在这里插入图片描述
在这里插入图片描述
1.1、获取dataBinder工厂 ,通过获取handler所在类上的initBinder创建dataBinder工厂

private WebDataBinderFactory getDataBinderFactory(HandlerMethod handlerMethod) throws Exception {
		Class<?> handlerType = handlerMethod.getBeanType();
		Set<Method> methods = this.initBinderCache.get(handlerType);
		if (methods == null) {
			// 获取handler类上的iniBinder方法,简单来所就是判断是否存在@InitBinder
			methods = MethodIntrospector.selectMethods(handlerType, INIT_BINDER_METHODS);
			this.initBinderCache.put(handlerType, methods);
		}
		List<InvocableHandlerMethod> initBinderMethods = new ArrayList<>();
		// 获取全局的initBinder
		this.initBinderAdviceCache.forEach((clazz, methodSet) -> {
			if (clazz.isApplicableToBeanType(handlerType)) {
				Object bean = clazz.resolveBean();
				for (Method method : methodSet) {
					initBinderMethods.add(createInitBinderMethod(bean, method));
				}
			}
		});
		// 指定类上的initBinder
		for (Method method : methods) {
			Object bean = handlerMethod.getBean();
			initBinderMethods.add(createInitBinderMethod(bean, method));
		}
		return createDataBinderFactory(initBinderMethods);
	}

1.2、创建modelFactory工厂,获取modelMethod

在这里插入图片描述

1.3、为当前handler方法 设置参数解析器,返回值解析器,dataBinderFactory

在这里插入图片描述

默认的参数解析器

在这里插入图片描述

默认的返回值解析器

在这里插入图片描述

此时我们的handler目标方法,存放了dataBinderFactory,参数解析器,返回值解析器,所在Bean对象,handler方法,handler方法上的参数

在这里插入图片描述
1.4、开始调用真正的handler方法
在这里插入图片描述

2、获取handler上的方法参数,获取默认的参数解析器,遍历参数解析器,看是否支持,如果支持,那么通过参数解析器,解析当前参数

在这里插入图片描述
在这里插入图片描述

以参数上的@RequestBody为例,无非是判断参数上,是否存在@RequestBody注解,如果满足,那么当前的参数解析器就是满足的

在这里插入图片描述
通过参数解析器解析当前参数

在这里插入图片描述

参数处理器解析参数,本质上是通过request进行的

参数是对象

例如: handler方法上存在参数 User user,方法上存在@RequestBody注解,那么找到RequestBodyReserver解析器,解析参数User。

通过request读取流的方式,封装成目标类型对象user

参数是普通参数

例如: handler方法上存在参数 Integer Id

然后通过request.getParameter(属性名),获取request中的属性值,然后反射将属性值赋值给对应的属性。最终user对象通过反射创建完成,并且通过反射赋值成功

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

反射调用initBinder方法

在这里插入图片描述

在这里插入图片描述

通过解析到的参数 反射调用目标方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白鸽呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值