本节书摘来自异步社区《Spring Data实战》一书中的第1章,第1.2节,作者: 【美】Mark Pollack , Oliver Gierke , Thomas Risberg , Jon Brisbin , Michael Hunger著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.2 主题概述
Spring Data的核心目标是:支持对所有的存储进行资源配置,从而实现对该存储的访问。这种支持主要是通过XML命名空间和Spring JavaConfig的支持类实现的,这可以使我们轻松地对Mongo数据库、嵌入式Neo4j实例等建立访问。除此之外,它也集成了Spring的核心功能,如JMX。这意味着某些存储可以通过原生API暴露统计数据,这些数据将会由Spring Data暴露给JMX。
大部分的NoSQL Java API并未支持将领域对象映射到存储的数据抽象(MongoDB中的文件,Neo4j中的节点与关系)。因此,当使用原生的Java驱动程序进行读取和写入操作时,通常需要编写大量的代码来将数据映射到应用程序的领域对象。所以Spring Data模块最核心的部分是一个映射和转换的API,用来获取要持久化的领域类中的元数据,使得任意领域对象都可以转换成存储用的数据类型。
在此基础上,就如同著名的Spring JdbcTemplate、JmsTemplate等,我们也会看到以模板模式实现的API,其中包括RedisTemplate、MongoTemplate等。或许你已经知道,这些模板提供了让我们可以执行常用操作的辅助方法。例如:在一条语句中持久化一个对象的时候,能够自动进行资源管理和异常处理。此外,还提供了回调接口的API,允许在资源管理和异常处理过程中使用存储原生的API,以提高灵活性。
这些功能给我们提供了一个工具箱,使得我们可以像使用传统的数据库那样来实现数据访问层。后面的章节将会详细介绍这些功能。为了让程序变得更简单,Spring Data还在模板实现的基础上提供了一个存储(repository)抽象,这将减少数据访问对象在实现一个普通接口时去定义通用场景的代价,如标准的CRUD(创建、读取、更新、删除)操作以及执行存储支持的查询语句。事实上,这种抽象位于最顶层,而且它会尽可能在合理范围内将不同存储API融合在一起。因此,存储的操作将拥有许多共同点。这也是后面会有专门的章节(第2章)来介绍基本编程模型的原因。
接着,我们来看一下用来展示这些特定存储模块功能所用的示例代码和领域模型。