概述
Spring 数据绑定(Data Binding)的作用是将用户的输入动态绑定到应用程序的领域模型JavaBean(或用于处理用户输入的任何对象)。 也就是说,Spring数据绑定机制是将属性值设置到目标对象中。如下图所示:
数据绑定机制
Spring的数据绑定机制是一种将HTTP请求参数自动绑定到Java对象属性的机制,通常用于处理Web应用程序中的表单数据传输。这个机制允许您以一种类型安全的方式访问和处理HTTP请求中的数据,无需手动解析和转换参数。
-
数据绑定:数据绑定是将HTTP请求参数(如表单字段、URL参数等)映射到Java对象的过程。Spring通过使用HTTP请求中的参数名称和Java对象的属性名称来自动完成这个映射。
-
数据绑定上下文:Spring维护一个数据绑定上下文,其中包含了将HTTP请求参数映射到Java对象的规则和配置信息。这个上下文可以通过
@ModelAttribute、@RequestParam等注解来配置。 -
@ModelAttribute:
@ModelAttribute注解用于将HTTP请求参数绑定到一个特定的Java对象。您可以在控制器方法的参数上使用@ModelAttribute注解,以指定要绑定的对象,并通过其属性名与请求参数匹配。@PostMapping("/save") public String saveData(@ModelAttribute User user) { // 执行保存操作,user对象已经包含了HTTP请求参数的值 return "success"; } -
@RequestParam:
@RequestParam注解用于将单个HTTP请求参数映射到方法的参数。您可以使用该注解指定请求参数的名称,以及可选的默认值和其他属性。@GetMapping("/search") public String searchData(@RequestParam(name = "query", defaultValue = "") String query) { // 使用查询参数执行搜索操作 return "results"; } -
数据转换和格式化:Spring能够自动进行数据类型转换和格式化,以便将请求参数的字符串表示形式转换为Java对象的属性类型。例如,将字符串转换为整数、日期等。
-
数据验证:Spring还支持数据验证,您可以使用
@Valid注解和javax.validation中的验证注解来验证绑定的数据是否符合规则。 -
自定义数据绑定:如果需要更复杂的数据绑定逻辑,您可以自定义数据绑定器(DataBinder)。这允许您创建自定义的数据绑定规则,以适应特定的业务逻辑和数据类型转换需求。
Spring的数据绑定机制大大简化了处理HTTP请求数据的任务,提高了开发效率并减少了手动数据解析和转换的工作。
Spring 提供了DataBinder来做到这一点。此外,BeanWrapper 也具有类似的功能,DataBinder和较低级别的BeanWrapper都使用PropertyEditorSupport 来实现解析和格式化属性值。
但DataBinder是 在org.springframework.validation 内的,因此它也支持验证功能。
Databinder
在 Spring 中,DataBinder 类是数据绑定功能的基类。他的直接子类是WebDataBinder(主要用于 Spring Web 数据的绑定),此外,还有一些 WebDataBinder 的扩展子类,如下图所示:
核心属性
| 属性 | 说明 |
|---|---|
| target | 要绑定的目标对象(或者null 如果绑定器仅用于转换普通参数值) |
| objectName | 目标对象的名称 |
| bindingResult | 属性绑定结果(绑定结果的通用接口。扩展了 Errors错误注册功能的接口,允许Validator应用,并添加了特定于绑定的分析和模型构建。) |
| typeConverter | 类型转换器(定义类型转换方法的接口。通常(但不一定)与PropertyEditorRegistry接口结合实现 - 线程不安全) |
| conversionService | 类型转换服务(用于类型转换的服务接口。这是转换系统的入口点。调用convert(Object, Class)以使用该系统执行线程安全类型转换) |
| messageCodesResolver | 消息代码解析器(用于从验证错误代码构建消息代码的策略接口。由 DataBinder 用于构建 ObjectErrors 和 FieldErrors 的代码列表。生成的消息代码对应于 MessageSourceResolvable 的代码(由 ObjectError 和 FieldError 实现)。) |
| validators | 验证器(特定于应用程序的对象的验证器。该界面完全脱离任何基础设施或上下文;也就是说,它不与仅验证 Web 层、数据访问层或其他层中的对象相关。因此,它适合在应用程序的任何层中使用,并支持将验证逻辑封装为一等公民。) |
绑定参数
| 参数名称 | 说明 |
|---|---|
| allowedFields | 注册应允许绑定的字段模式 (白名单) |
| disallowedFields | 注册不允许绑定的字段模式(黑名单) |
| ignoreInvalidFields | 是否忽略无效字段,即是否忽略目标对象中具有不可访问的对应字段(例如由于嵌套路径中为空值)的绑定参数。默认值:false |
| ignoreUnknownFields | 是否忽略未知字段,即是否忽略目标对象中没有对应字段的绑定参数。默认值:true |
| autoGrowNestedPaths | 是否自动增加嵌套路径,默认值:true |
| requiredFields | 绑定必须字段 |
| autoGrowCollectionLimit | 指定数组和集合自动增长的限制。 |
绑定元数据
| 特征 | 说明 |
|---|---|
| 数据来源 | BeanDefinition,主要来源 XML 资源配置 BeanDefinition |
| 数据结构 | 由一个或多个 PropertyValue 组成 |
| 成员结构 | PropertyValue 包含属性名称,以及属性值(包括原始值、类型转换后的值) |
| 常见实现 | MutablePropertyValues |
| Web 扩展实现 | ServletConfigPropertyValues、ServletRequestParameterPropertyValues |
| 相关生命周期 | InstantiationAwareBeanPostProcessor#postProcessProperties |
绑定验证
DataBinder 与 BeanWrapper(BeanWrapper通常不由应用程序代码直接使用,而是由DataBinder和BeanFactory使用。)
- bind 方法生成 BeanPropertyBindingResult
- BeanPropertyBindingResult 关联 BeanWrapper
作用
DataBinder 的作用包括以下几个方面:
-
数据绑定:
DataBinder主要用于将外部数据(例如 HTTP 请求参数、属性文件、XML 文件等)绑定到 Java 对象上。这可以包括将字符串转换为合适的 Java 数据类型,以及将这些值设置到 Java 对象的属性中。 -
类型转换:
DataBinder负责处理数据类型之间的转换,例如将字符串表示的数字转换为整数、将日期字符串解析为Date对象等。这有助于确保绑定的数据与目标对象属性的类型相匹配。 -
数据格式化:除了类型转换,
DataBinder还支持数据格式化。它可以将日期、时间、货币等数据格式化为特定的字符串表示形式,以便于展示或存储。 -
数据验证:
DataBinder也可以执行数据验证操作,以确保绑定的数据符合预期的规则和约束。它可以使用验证框架(如 Hibernate Validator 或 Java Bean Validation API)来进行数据验证。 -
定制绑定规则:
DataBinder允许您自定义绑定规则和转换器,以适应特定的业务需求。您可以注册自定义的编辑器、格式化器和验证器来处理特定数据类型或属性。 -
异常处理:
DataBinder会捕获并处理数据绑定过程中可能出现的异常,例如类型不匹配、格式错误等。这有助于确保数据绑定操作的健壮性,同时提供友好的错误处理机制。 -
与 Spring MVC 集成:在 Spring MVC 中,
DataBinder在处理表单提交时起到关键作用。它能够将请求参数自动绑定到控制器方法的参数对象中,并执行类型转换、数据验证等操作。
DataBinder 是 Spring 框架中用于数据绑定和数据处理的核心组件之一。它提供了强大的功能,使开发人员能够轻松地将外部数据与 Java 对象集成在一起,同时处理数据的转换、格式化和验证。
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论 你的评价就是我✍️创作的动力! 💞💞💞