上一篇文章用介绍了如何配置spring-data-mongo连接到MongoDB上,如何创建MongoTemplate。MongoTemplate就相当于一个通用的仓库,可以持久化业务对象。

  在spring-data-mongo 1.2.1.RELEASE版的手册中,有两个大章节介绍了和仓库相关的内容,可见其重要。

  

  

曾经有过一些疑问,整理一下:

1、 为什么要用Repository?

  字面的翻译是“仓库”,就是对应的Bean的仓库,它应该提供了Bean对象的基础操作方法,比如save, delete等等。

2、Repository在哪里?

  现在用的spring-data-mongodb 1.2.1.RELEASE版本,看手册用到了Repository接口,发现是在spring-data-common中定义的,还有相关的CurdRepository等都是这个包中定义的。为了开发时方便,最好把spring-data-common一块下载下来,API放在手边查。

3、怎么实现Repository?

  org.springframework.data.mongodb.repository包,是有关仓库定义的。

  org.springframework.data.mongodb.repository.support包,有两个与Repository实现直接相关的类:QueryDslMongoRepository, SimpleMongoRepository,根据自己的需要来使用。

  spring-data-common中定义的Repository没有提供具体接口方法,只是要求实现时必须传入对象类型和对象标识的类型。在MongoDB中,对象的标识类型是ObjectId。

4、在什么地方实现对象的操作方法?

  这个问题只是我个人的一点考虑,得根据自己的需求来思考。

  最初的想法是在业务对象上直接实现操作方法,如save, delete,那么就需要业务Bean或它的基类去实现Repository相关的接口。这种方法比较方便,思想是对象知道如何“维护”自己,不需要在代码中引入专门的操作对象。缺点是,如果需要扩展对象的操作方法,就要修改Bean或其父类的具体实现。

  如果使用专门的Repository对象,思想就是“由仓库来维护对象”。那么所有的操作要放到仓库对象中,而业务对象只有自己的业务方法和Bean(Getter/Setter)方法。这种方式会把业务对象与业务对象的操作分离开,比较清晰。

----------------------------------------------------------------------------------------

  OK,下面在正式介绍如何开发仓库之前,先解释一个重要的东西:@Autowired。

  这是Spring中的实现,其功能简单的说就是:用@Autowired声明的类成员,可以不实现Getter/Setter方法,由Spring自动实现Getter/Setter的功能。spring-data-mongo对类仓库成员的自动注入就是基于此实现的。

----------------------------------------------------------------------------------------

  下面来详细说下如何实现。我在实现之前查了网上的文章,多数把代码和配置列出来,但没有说详细的说明,以致于自己又拿着手册,试了多次才成功。在做的过程中碰到些问题,也经历了些思考,写出来供大家参考。

  实现的过程分下面4步:

  1、 定义业务对象的Repository接口(方法);

  2、 实现业务对象的接口,默认后缀名是Impl;

  3、 定义业务对象,使用Repository(这一步是自动绑定的,但如何自动绑定,绑定到什么程度,让我花了不少时间)

  4、 修改POM.xml配置

下面来具体说说:

1、 定义Repository接口

  接口可以直接扩展Repository<T,ID extends Serializable>,这个接口的目的是确定业务对象类型和业务对象标识的类型。

  也可以扩展MongoRepository<T,ID>接口,定义如下:

  

  使用这两个接口区别是:

  * Repository,直接声明自己的仓库接口,无须管其它。使用的时候,对象的一般存取直接使用MongoTemplate,而专门的方法才使用仓库中的方法;

  * MongoRepository,声明了几乎所有常用的方法(由CurdRepository, PagingAndSOringRepository和Repository提供的),你的仓库也要实现这些方法。

2、 实现业务对象的Repository接口

  有了接口定义就要实现它。

  如果定义的接口只是扩展了Repository,那么只需实现自定义的业务方法。

  如果定义的接口扩展了MongoRepository,就要实现所有相关的基础方法。这里要注意,之所以使用Repository,就是避免编写大量相似的模板代码,如果自己实现这些方法就失去使用Repository的意义了。

  spring-data-mongo在在org.springframework.data.mongodb.repository.
  support包中提供了SimpleMongoRepository和QueryDslMongoRepository类,专门用来实现这些基础方法。

  

  所以,你的业务仓库类应该是SimpleMongoRepository的子类。

  到这里要说仓库的另一种用法,就像前面讲到的,把所有的操作方法都放到业务类上。一般来说,业务类都派生自一个自定义的抽象父类,那么就要求这个父类是SimpleMongoRepository的子类,实现MongoRepository接口。

  使用的时候,代码有下面两种方式:

  customObject.save();

  或

  customObjectRepository.save( customObject );

3、 定义业务组件

  这里说的业务组件是广泛意义的业务组件,指需要使用Repository的类。

public class CustomObjectClient {
@Autowired
public CustomRepository customRepository; public String getObjectName() {
return customRepository.findByName( "XXX" );
}
}

  把仓库类型的成员用@Autowired标识,由Spring来完成Getter/Setter的功能。那么这个值如何赋上的呢?来看第4步。

4、 修改POM.xml配置

  1) 要先映射仓库的Bean:

<bean name="CustormRepository" class="com.XXX.repositories.CustormRepositoryImp" />

  仓库实现要求有默认构造方法。

  2) 定义组件Bean:

<bean id="CustormClient" class="com.XXX. CustormClient" />

  3) 指定Mongo仓库的目录:

  组件bean中用@Autowired标识的成员类型与上面的仓库Bean的名称对应

<!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 -->
<mongo:repositories base-package="com.XXX.*repositories" />

  spring-data-mongo按上面的路径扫描,把找到的仓库注入到业务组件中。

  然后,然后就是编写你的业务代码了~~~

【原】Spring与MongoDB集成:仓库的更多相关文章

  1. 【原】Spring与MongoDB集成:配置

    MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现.但是并没有提供DBObject与BeanObject的转换.在还没有了解到与 ...

  2. spring boot MongoDB的集成和使用

    前言 上一章节,简单讲解了如何集成Spring-data-jpa.本章节,我们来看看如何集成NoSQL的Mongodb.mongodb是最早热门非关系数据库的之一,使用也比较普遍.最适合来存储一些非结 ...

  3. Spring Boot WebFlux 集成 Mongodb 数据源操作

    WebFlux 整合 Mongodb 前言 上一讲用 Map 数据结构内存式存储了数据.这样数据就不会持久化,本文我们用 MongoDB 来实现 WebFlux 对数据源的操作. 什么是 MongoD ...

  4. Spring系列之集成MongoDB的2种方法

    MongoDB是最流行的NoSQL数据库,SpringBoot是使用Spring的最佳实践.今天带大家讲一讲SpringBoot集成MongoDB的两种方式,MongoDB的安装自行去官网查询,本地开 ...

  5. Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)

    一.简介 Spring Data  MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...

  6. Spring Boot快速集成kaptcha生成验证码

    Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码,以图片的形式显示,从而无法进行复制粘贴:下面将详细介绍下Spring Boot快速集成kaptcha生成验证码的过程. 本 ...

  7. Java | Spring Boot Swagger2 集成REST ful API 生成接口文档

      Spring Boot Swagger2 集成REST ful API 生成接口文档 原文 简介 由于Spring Boot 的特性,用来开发 REST ful 变得非常容易,并且结合 Swagg ...

  8. Spring整合MongoDB(转)

    1.认识Spring Data MongoDB 之前还的确不知道Spring连集成Nosql的东西都实现了,还以为自己又要手动封装一个操作MongoDB的API呢,结果就发现了Spring Data ...

  9. spring data mongodb 配置遇到的几个问题

    一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...

随机推荐

  1. mysql数据库基础的简单操作指南

    最近在学习mysql,本文是做的关于mysql学习的笔记,跟大家分享一下,希望对大家学习mysql知识有所助益.mysql现在几乎已经成了网站建设的主流数据库,很多php网站系统都采用了mysql数据 ...

  2. HIbernate学习笔记(五) 关系映射之一对多与多对一

    三.       多对一 –单向 场景:用户和组:从用户角度来,多个用户属于一个组(多对一 关联) 使用hibernate开发的思路:先建立对象模型(领域模型),把实体抽取出来. 目前两个实体:用户和 ...

  3. 29个你必须知道的Linux命令

    虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的.Bash和 Linux Shell ...

  4. Apache Hadoop 源码阅读

    总之一句话,这些都是hadoop-2.2.0的源代码里有的.也就是不光只是懂理论,编程最重要,还是基本功要扎实啊.... 在hadoop-2.2.0的源码里,按Ctrl + Shift + T . 跳 ...

  5. Fragment回调顺序及getActivity()为NullPointerException解决方法

    Fragment回调顺序 onAttach->onCreate->onCreateView->onActivityCreated ps:最后发现经常在Fragment里面getAct ...

  6. hdoj 1071 The area

    The area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. Countly在andoid和vps集成使用,开源的统计分析sdk

    这几天项目需要,简单研究了一下countly,说实话完全满足项目需要,比umeng这类产品干净多了. Countly Mobile Analytics 下面就讲一下android 集成的过程,以及 服 ...

  8. SQL 存储过程(学生,课程表,选修表)

    SQL 存储过程(学生,课程表,选修表) 一.存储过程的分类 在SQL Server中存储过程分过两类: 1)系统存储过程("sp_"作为前缀) 2)用户自定义存储过程 二.创建和 ...

  9. JS基础DOM篇之一:何为DOM?

    近日在园子看了一篇文章,一位前端负责人问应聘者何为DOM事件流的三个阶段,我当时一看也是懵圈,于是强迫症复发,遂想要搞清楚它.谁知在查资料的过程中发现有好多关于DOM的概念也是模糊不清,便决定继续延伸 ...

  10. Css基础-id选择器

    id 选择器以#来定义 <p id="pid">Hello css</p> #pid { color:red; } <div id="div ...