spring · 24 4 月, 2021 0

Spring数据绑定

Spring 数据绑定使用场景

  • Spring BeanDefinition到Bean实例创建

  • Spring 数据绑定(DataBinder)

  • Spring Web参数绑定(WebDataBinder)

Spring 数据绑定组件

  • 标准组件

    • org.springframework.validation.DataBinder

  • Web组件

    • org.springframework.web.bind.WebDataBinder

    • org.springframework.web.bind.ServletRequestDataBinder

    • org.springframework.web.bind.support.WebRequestDataBinder

    • org.springframework.web.bind.support.WebExchangeDataBinder(since 5.0)

Databinder核心属性

属性 说明
target 关联目标Bean对象
objectName 目标Bean名称
bindingResult 属性绑定结果
typeConverter 类型转换器
conversionService 类型转换服务
messageCodeResolver 检验错误文案Code处理器
validators 管理的Bean Validator实例集合

DataBinder绑定方法

  • bind(PropertyValues): 将PropertyValues Key-Value内容映射到关联Bean中的属性上

    • 假设PropertyValues中包含name=xianglj的键值对时, 同时Bean对象User中存在name属性, 当bind方法执行时, User对象中的name属性值将被绑定为xianglj

Spring数据绑定元数据

  • DataBinder元数据-PropertyValues

特征 说明
数据来源 BeanDefinition, 主要来源XML资源配置BeanDefinition
数据结构 由一个或多个PropertyValue组成
成员结构 PropertyValue包含属性名称,以及属性值
常见实现 MultablePropertyValues
Web扩展实现 ServletConfigPropertyValues, ServletRequestParameterPropertyValues
相关声明周期 InstantiationAwareBeanPostProcessor#postProcessProperties

Spring 数据绑定控制参数

  • DataBinder绑定特殊场景分析

    • 当PropertyValues中包含名称x的PropertyValue, 目标对象不存在x属性,当bind方法执行时,会发生什么(忽略无法识别的属性)?

    • 当PropertyValues中包含名称x的PropertyValue, 目标对象B中存在x属性,当bind方法执行时,如何避免B属性x不被绑定?

    • 当PropertyValues中包含名称x.y的PropertValue,目标对象B中存在x属性,当bind方法执行时,会发生什么(能够赋值嵌套属性)?

DataBinder绑定控制参数

参数名称 说明
ignoreUnknownFields 是否忽略未知字段,默认值: true
ignoreInvalidFields 是否忽略非法字段,默认值为false
autoGrowNestedPaths 是否自动增加嵌套路径, 默认值: true
allowedFields 绑定字段白名单
disallowedFields 绑定字段黑名单
requiredFields 必须绑定字段

Spring 底层Java Beans替换实现

  • Java Beans核心实现 – java.beans.BeanInfo

    • 属性(property)

      • java.beans.PropertyEditor

    • 方法(Method)

    • 事件(Event)

    • 表达式(Expression)

  • Spring替代实现- org.springframework.beans.BeanWrapper

    • 属性(Property)

      • java.beans.PropertyEditor

    • 嵌套属性路径(nested path)

BeanWrapper的使用场景

  • BeanWrapper

    • Spring底层JavaBeans基础设施的中心化接口

    • 通常不会直接使用,简介用于BeanFactory和DataBinder

    • 提供标准JavaBeans分析和操作,能够单独或批量存储Java Bean的属性

    • 支持嵌套属性路径(nested path)

    • 实现类org.springframework.beans.BeanWrapperImpl

Java Beans

  • 标准Java Beans是如何操作属性的

    API 说明
    java.beans.Introspector Java Beans 内省API
    java.beans.BeanInfo Java Beans原信息API
    java.beans.BeanDescriptor Java Bean 信息描述符
    java.beans.PropertyDescriptor Java Bean 属性描述符
    java.beans.MethodDescriptor Java Bean 方法描述符
    java.beans.EventSetDescriptor Java Bean 事件集合描述符

    DataBinder数据校验

    • DataBinder 与 BeanWrapper

      • bind方法生成BeanPropertyBindingResult

      • BeanPropertyBindingResult关联BeanWrapper