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

简介: 在适用springMVC的时候,通过注解可以很方便的封装请求数据,响应前端数据,很好奇怎么实现的,于是探索一下

准备

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

我们之前分析过通过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方法

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关文章

推荐镜像

更多