准备
我们之前分析过通过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方法
通过解析到的参数 反射调用目标方法