SpringMVC架构代码解析之webDataBinder

原创 码农  2020-01-06 10:33:27  阅读 751 次 评论 0 条

源码解析


SpringMVC架构代码解析之webDataBinder SpringMVC架构代码解析之webDataBinder 架构


org.springframework.web.bind.support.WebDataBinderFactory 为指定目标对象创建WebDataBinder实例的工厂。

WebDataBinder createBinder(NativeWebRequest webRequest, Object target, String objectName) throws Exception;

创建WebDataBinder,这里是工厂模式实现

org.springframework.web.bind.support.DefaultDataBinderFactory 创建一个WebRequestDataBinder实例,并用WebBindingInitializer初始化它。

 

@Override
  public final WebDataBinder createBinder(NativeWebRequest webRequest, Object target, String objectName)
      throws Exception {

//    创建数据绑定对象-》模板方法
    WebDataBinder dataBinder = createBinderInstance(target, objectName, webRequest);
    if (this.initializer != null) {
//      WebBindingInitializer初始化绑定器 -》
      this.initializer.initBinder(dataBinder, webRequest);
    }
//    初始化绑定器-》模板方法
    initBinder(dataBinder, webRequest);
    return dataBinder;
  }


创建WebDataBinder并初始化,org.springframework.web.bind.support.DefaultDataBinderFactory#createBinderInstance 创建WebDataBinder实例的扩展点。默认情况下,这是WebRequestDataBinder。这里是模板方法实现

protected WebDataBinder createBinderInstance(Object target, String objectName, NativeWebRequest webRequest)
      throws Exception {

    return new WebRequestDataBinder(target, objectName);
  }

创建WebDataBinder,这里是工厂方法实现。org.springframework.web.bind.support.DefaultDataBinderFactory#initBinder 扩展点,以通过WebBindingInitializer在“全局”初始化后进一步初始化创建的数据绑定实例(例如使用@InitBinder方法)。

protected void initBinder(WebDataBinder dataBinder, NativeWebRequest webRequest) throws Exception {  
}

子类需要这个模板方法。org.springframework.web.method.annotation.InitBinderDataBinderFactory 通过@InitBinder方法向WebDataBinder添加初始化。


@Override
  public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception {
    for (InvocableHandlerMethod binderMethod : this.binderMethods) {
//      如果方法上有@InitBinder注解-》
      if (isBinderMethodApplicable(binderMethod, dataBinder)) {
//        执行请求-》
        Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder);
        if (returnValue != null) {
          throw new IllegalStateException(
              "@InitBinder methods must not return a value (should be void): " + binderMethod);
        }
      }
    }
  }


如果方法上有@InitBinder注解,执行方法。org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest 在给定请求的上下文中解析方法的参数值后调用该方法。参数值通常通过HandlerMethodArgumentResolvers解析。但是providedArgs参数可以提供直接使用的参数值,即没有参数解析。提供的参数值示例包括WebDataBinder、SessionStatus或抛出异常实例。在参数解析器之前检查参数值。

public Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer,
      Object... providedArgs) throws Exception {

//    解析请求参数值 -》
    Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
    if (logger.isTraceEnabled()) {
      logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
          "' with arguments " + Arrays.toString(args));
    }
//    执行方法
    Object returnValue = doInvoke(args);
    if (logger.isTraceEnabled()) {
      logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
          "] returned [" + returnValue + "]");
    }
    return returnValue;
  }

调用参数解析器解析参数并执行方法获得返回值,org.springframework.web.bind.WebDataBinder 用于将数据从web请求参数绑定到JavaBean对象的特殊DataBinder。设计用于web环境,但不依赖于Servlet API;用作更具体的DataBinder变体(如ServletRequestDataBinder)的基类。包括对解决HTML复选框常见问题的字段标记的支持和选择选项:检测字段是否是表单的一部分,但由于它是空的,所以没有生成请求参数。字段标记允许检测该状态并相应地重置相应的bean属性。对于不存在的参数,默认值可以为字段指定一个值,然后为空。org.springframework.web.bind.support.WebRequestDataBinder 特殊org.springframework.validation。DataBinder执行从web请求参数到javabean的数据绑定,包括对多部分文件的支持。有关自定义选项,请参见DataBinder/WebDataBinder超类,其中包括指定允许/必需字段和注册自定义属性编辑器。还可以用于自定义web控制器或基于Spring的WebRequest抽象的拦截器中的手动数据绑定:例如,在org.springframe .web.context.request中。WebRequestInterceptor实现。只需为每个绑定过程实例化一个WebRequestDataBinder,并使用当前的WebRequest作为参数调用bind

org.springframework.web.bind.ServletRequestDataBinder 特殊org.springframework.validation。DataBinder执行从servlet请求参数到javabean的数据绑定,包括对多部分文件的支持。有关自定义选项,请参见DataBinder/WebDataBinder超类,其中包括指定允许/必需字段和注册自定义属性编辑器。还可以用于自定义web控制器中的手动数据绑定:例如,在普通控制器实现中或在MultiActionController处理程序方法中。只需为每个绑定过程实例化一个ServletRequestDataBinder,并使用当前ServletRequest作为参数调用bind,org.springframework.web.bind.support.WebBindingInitializer 回调接口,用于初始化WebDataBinder,以便在特定web请求的上下文中执行数据绑定。


void initBinder(WebDataBinder binder, WebRequest request);


为给定的请求初始化给定的DataBinder。org.springframework.web.bind.support.ConfigurableWebBindingInitializer 方便的WebBindingInitializer在Spring应用程序上下文中进行声明性配置。允许使用多个控制器/处理程序重用预配置的初始化器。

private Validator validator;

validator

private ConversionService conversionService;

conversionService


说在最后

本次解析仅代表个人观点,仅供参考。

本文地址:https://www.itcodeit.com/post/41.html
版权声明:本文为原创文章,版权归 码农 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?