代码仓库
本章将介绍 Spring Data 仓库的基本原理以及 MongoDB 的特定内容。在继续深入了解 MongoDB 的具体内容之前,请确保你已经对基本概念有了扎实的理解。
Spring Data 仓库抽象的目标是显著减少为各种持久化存储实现数据访问层所需的样板代码量。
章节摘要
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository。它将管理的领域类以及领域类的标识符类型作为类型参数。该接口主要作为标记接口,用于捕获要处理的类型,并帮助你发现扩展此接口的其他接口。
📄️ 定义仓库接口
要定义一个仓库接口,首先需要定义一个特定于领域类的仓库接口。该接口必须继承 Repository,并指定领域类和 ID 类型。如果你想为该领域类型公开 CRUD 方法,可以继承 CrudRepository 或其变体,而不是 Repository。
📄️ MongoDB 仓库(Repositories)
本章指出了 MongoDB 仓库支持的特殊性。本章建立在核心概念中解释的核心仓库支持基础上。你应该对那里解释的基本概念有深入的理解。
📄️ Spring Data 扩展
本节记录了一组 Spring Data 扩展,这些扩展使得 Spring Data 可以在各种上下文中使用。目前,大多数集成都是针对 Spring MVC 的。
📄️ 创建仓库实例
本节介绍如何为定义的仓库接口创建实例和 bean 定义。
📄️ 定义查询方法
仓库代理有两种方式从方法名称派生特定于存储的查询:
📄️ MongoDB 特定的查询方法
通常你在仓库上触发的大多数数据访问操作都会导致针对 MongoDB 数据库执行一个查询。定义这样的查询只需在仓库接口上声明一个方法,如下例所示:
📄️ MongoDB 特定的数据操作方法
除了查询方法外,还可以使用专门的方法来更新数据。
📄️ 投影
Spring Data 查询方法通常返回由仓库管理的聚合根的一个或多个实例。然而,有时可能希望基于这些类型的某些属性创建投影。Spring Data 允许建模专门的返回类型,以更有选择性地检索托管聚合的部分视图。
📄️ 自定义仓库实现
Spring Data 提供了多种选项来创建查询方法,只需少量编码。但当这些选项无法满足你的需求时,你也可以为仓库方法提供自定义的实现。本节将介绍如何做到这一点。
📄️ 从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计(Domain-Driven Design)应用中,这些聚合根通常会发布领域事件。Spring Data 提供了一个名为 @DomainEvents 的注解,你可以在聚合根的方法上使用它,以便尽可能轻松地发布这些事件,如下例所示:
📄️ 仓库方法的空值处理
自 Spring Data 2.0 起,返回单个聚合实例的仓库 CRUD 方法使用 Java 8 的 Optional 来表示可能缺失的值。除此之外,Spring Data 还支持在查询方法中返回以下包装类型:
📄️ CDI 集成
仓库接口的实例通常由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。自 1.3.0 版本起,Spring Data MongoDB 附带了一个自定义的 CDI 扩展,允许你在 CDI 环境中使用仓库抽象。该扩展是 JAR 文件的一部分。要激活它,只需将 Spring Data MongoDB 的 JAR 文件放入你的类路径中。现在,你可以通过为 MongoTemplate 实现一个 CDI Producer 来设置基础设施,如下例所示:
📄️ 仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制通常支持的主题关键字,用于表达谓词。由于某些列出的关键字在特定存储中可能不受支持,因此请查阅特定存储的文档以获取支持的确切关键字列表。
📄️ 仓库查询返回类型
下表列出了 Spring Data 仓库通常支持的返回类型。然而,由于某些类型在特定存储中可能不受支持,请查阅具体存储的文档以获取支持的返回类型的准确列表。