Spring Data Commons
通过 Spring Data Commons 探索 Spring Data 提供的常用功能。
简介
Spring Data Commons 是 Spring Data 项目的一部分,为其他 Spring Data 模块(如 Spring Data JDBC、Spring Data JPA 和 Spring Data MongoDB)提供通用的技术能力。
该模块的主要目标是实现与底层数据源无关的接口和抽象,使其能够广泛适用于所有 Spring Data 模块。
通过 Spring Data Commons 提供的共享基础设施,各个 Spring Data 模块获得了以下技术能力:
- 仓库抽象(
CrudRepository和PagingAndSortingRepository) - 自定义对象映射
- 跨存储持久化
- 动态查询生成
- 通过基本属性定义领域类
- 通过
created和lastChanged等属性实现审计功能 - 支持自定义仓库
spring-data-commons 依赖
要在项目中添加对 Spring Data Commons 的支持,可以在 build.gradle 文件中引入 spring-data-commons 依赖:
1plugins { 2 id 'java' 3 id 'org.springframework.boot' version '3.0.2' 4 id 'io.spring.dependency-management' version '1.1.0' 5} 6 7group = 'com.smartdiscover' 8version = '0.0.1-SNAPSHOT' 9sourceCompatibility = '17' 10 11repositories { 12 mavenCentral() 13} 14 15dependencies { 16 implementation 'org.springframework.data:spring-data-commons:3.0.4' 17}
不过,通常无需手动单独添加此依赖,因为在配置 Spring Data JPA、Spring Data MongoDB 或 Spring Data Redis 等模块以连接特定数据源时,该项目依赖已自动包含在内。
Spring Data Commons 的对象映射
Spring Data Commons 为所有 Spring Data 模块提供了对象创建及映射到存储原生数据结构的基本支持。然而,具体的 Spring Data 模块可能会根据底层数据存储的特点覆盖默认的对象创建和映射行为。下面我们详细讨论它是如何处理领域对象的创建以及属性填充的。
创建领域对象
Spring Data 会查找领域类的构造函数来创建领域对象,其算法采用如下解析顺序:
- 首先查找带有
@PersistenceCreator注解的静态工厂方法。 - 若无上述方法,则使用领域类中唯一的构造函数。
- 如果存在多个构造函数,则选用带有
@PersistenceCreator注解的构造函数。 - 如果类型是一个 Java record,则使用其规范构造函数(canonical constructor)。
- 否则,优先使用无参构造函数来创建领域对象。
填充领域对象的属性
在创建领域对象之后,Spring Data 会尝试填充除构造函数已设置之外的所有持久化属性。
首先填充标识符值,通常对应 id 属性。随后,按照以下机制依次为其他持久化属性赋值:
- 对于不可变属性,尝试调用对应的
with方法。 - 查找该属性的 setter 方法。
- 若字段可变,则直接设置字段值。
- 对于没有
with方法的不可变属性,回退到使用带有@PersistenceCreator注解的构造函数进行初始化。
本课我们学习了 Spring Data Commons 及其在领域对象创建和对象属性映射方面的核心机制。