Spring(十三)-DataBanding数据绑定
参考文献
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
类型转换服务 messageCodesResolver
校验错误文案 Code 处理器 validators
关联的 Bean Validator
实例集合 -
DataBinder
绑定方法bind(PropertyValues)
:将PropertyValues
Key-Value 内容映射到关联 Bean(target)中的属性上- 假设
PropertyValues
中包含“name = Lin”的键值对,同时 Bean 对象 User 中存在 name
属性,当 bind 方法执行时,User 对象中的 name 属性值将被绑定为“Lin”。
- 假设
Spring 数据绑定元数据
-
DataBinder
元数据 -PropertyValues
特征 说明 数据来源 BeanDefinition
,主要来源 XML 资源配置BeanDefinition
数据结构 由一个或多个 PropertyValue
组成成员结构 PropertyValue
包含属性名称,以及属性值(包括原始值、类型转换后的值)常见实现 MutablePropertyValues
Web 扩展实现 ServletConfigPropertyValues、ServletRequestParameterPropertyValues
相关生命周期 InstantiationAwareBeanPostProcessor#postProcessProperties
Spring 数据绑定控制参数
-
DataBinder
绑定特殊场景分析- 当
PropertyValues
中包含名称x
的PropertyValue
,目标对象 B 不存在 x 属性,当 bind 方法执行时,会发生什么? - 当
PropertyValues
中包含名称x
的PropertyValue
,目标对象 B 中存在 x 属性,当 bind 方法执行时,如何避免 B 属性 x 不被绑定? - 当
PropertyValues
中包含名称x.y
的PropertyValue
,目标对象 B 中存在 x 属性(嵌套 y 属性),当bind 方法执行时,会发生什么?
- 当
-
DataBinder
绑定控制参数参数名称 说明 ignoreUnknownFields
是否忽略未知字段,默认值:true ignoreInvalidFields
是否忽略非法字段,默认值:false autoGrowNestedPaths
是否自动增加嵌套路径,默认值:true allowedFields
绑定字段白名单 disallowedFields
绑定字段黑名单 requiredFields
必须绑定字段
BeanWrapper
的使用场景
BeanWrapper
- Spring 底层
JavaBeans
基础设施的中心化接口 - 通常不会直接使用,间接用于
BeanFactory
和DataBinder
- 提供标准
JavaBeans
分析和操作,能够单独或批量存储 Java Bean 的属性(properties) - 支持嵌套属性路径(
nested path
) - 实现类
org.springframework.beans.BeanWrapperImpl
- Spring 底层
Spring 底层 Java Beans 替换实现
-
JavaBeans
核心实现 -java.beans.BeanInfo
- 属性(Property)
java.beans.PropertyEditor
- 方法(Method)
- 事件(Event)
- 表达式(Expression)
- 属性(Property)
-
Spring 替代实现 -
org.springframework.beans.BeanWrapper
- 属性(Property)
java.beans.PropertyEditor
- 嵌套属性路径(nested path)
- 属性(Property)
-
标准
JavaBeans
是如何操作属性的?API 说明 java.beans.Introspector
Java Beans 内省 API java.beans.BeanInfo
Java Beans 元信息 API java.beans.BeanDescriptor
Java Beans 信息描述符 java.beans.PropertyDescriptor
Java Beans 属性描述符 java.beans.MethodDescriptor
Java Beans 方法描述符 java.beans.EventSetDescriptor
Java Beans 事件集合描述符
DataBinder
数据校验
DataBinder
与BeanWrapper
- bind 方法生成
BeanPropertyBindingResult
BeanPropertyBindingResult
关联BeanWrapper
- bind 方法生成
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HoleLin's Blog!