SpringMVC的参数绑定底层原理之理解

  1. 数据绑定流程原理★
    ① Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象

② DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中

③ 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象

④ Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参

Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:
SpringMVC的参数绑定底层原理之理解_第1张图片
原理:SpringMVC如何确定POJO参数的值,以及将页面的值正确的赋值给POJO
1、使用数据绑定器来负责将页面带来的参数绑定到pojo中
复制代码
复制代码
binderFactory
//绑定器工厂根据当前请求,其他信息;创建出数据绑定器;
//数据绑定器负责将请求中的数据绑定到pojo中
WebDataBinder binder = binderFactory.createBinder(request, attribute, name);
if (binder.getTarget() != null) {
//数据绑定期间进行类型转换以及格式化工作
bindRequestParameters(binder, request);
//数据校验:email;birth;BindingResult组件中会封装错误信息;
validateIfApplicable(binder, parameter);
//数据校验错误信息处理
if (binder.getBindingResult().hasErrors()) {
//如果出错有处理
if (isBindExceptionRequired(binder, parameter)) {
\parameter指目标方法正在处理的当前参数 saveEmp(Employee emp)
protected boolean isBindExceptionRequired(WebDataBinder binder, MethodParameter parameter) {
int i = parameter.getParameterIndex();//获取参数索引
Class[] paramTypes = parameter.getMethod().getParameterTypes();//获取当前方法所有参数的参数类型

      //如果下一个参数是Errors旗下的,就返回成功;否则就是没人处理;
    boolean hasBindingResult =
           (paramTypes.length > (i + 1) && Errors.class.isAssignableFrom(paramTypes[i + 1]));

    return !hasBindingResult;
}
                
                 //如果没人处理就抛异常
                throw new BindException(binder.getBindingResult());
            }
        }
    }

复制代码
复制代码
2、DataBinder中有几个组件负责完成这几项工作;
3、ConversionService负责进行类型转换以及格式化工作
4、如果是数据校验使用校验器进行 validators
5、处理校验成功还是失败信息?BindingResult负责处理校验错误的信息
应用:
1)、自定义的类型转换器;

ConversionService 是 Spring 类型转换体系的核心接口。
可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService.
Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及
Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器

  1. Spring 支持的转换器类型
    

Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:

Converter:将 S 类型对象转为 T 类型对象

ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类

GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

你可能感兴趣的:(框架)