设为首页 收藏本站
查看: 1060|回复: 0

[经验分享] 【原】Spring与MongoDB集成:仓库

[复制链接]

尚未签到

发表于 2015-7-7 12:22:52 | 显示全部楼层 |阅读模式
    上一篇文章用介绍了如何配置spring-data-mongo连接到MongoDB上,如何创建MongoTemplate。MongoTemplate就相当于一个通用的仓库,可以持久化业务对象。
    在spring-data-mongo 1.2.1.RELEASE版的手册中,有两个大章节介绍了和仓库相关的内容,可见其重要。
     DSC0000.png
     DSC0001.png
  曾经有过一些疑问,整理一下:
  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,这个接口的目的是确定业务对象类型和业务对象标识的类型。
    也可以扩展MongoRepository接口,定义如下:
     DSC0002.jpg
    使用这两个接口区别是:
    * Repository,直接声明自己的仓库接口,无须管其它。使用的时候,对象的一般存取直接使用MongoTemplate,而专门的方法才使用仓库中的方法;
    * MongoRepository,声明了几乎所有常用的方法(由CurdRepository, PagingAndSOringRepository和Repository提供的),你的仓库也要实现这些方法。
  2、 实现业务对象的Repository接口
    有了接口定义就要实现它。
    如果定义的接口只是扩展了Repository,那么只需实现自定义的业务方法。
    如果定义的接口扩展了MongoRepository,就要实现所有相关的基础方法。这里要注意,之所以使用Repository,就是避免编写大量相似的模板代码,如果自己实现这些方法就失去使用Repository的意义了。
    spring-data-mongo在在org.springframework.data.mongodb.repository.
  support包中提供了SimpleMongoRepository和QueryDslMongoRepository类,专门用来实现这些基础方法。
DSC0003.jpg
    所以,你的业务仓库类应该是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:




    仓库实现要求有默认构造方法。
    2) 定义组件Bean:




    3) 指定Mongo仓库的目录:
    组件bean中用@Autowired标识的成员类型与上面的仓库Bean的名称对应





    spring-data-mongo按上面的路径扫描,把找到的仓库注入到业务组件中。
    然后,然后就是编写你的业务代码了~~~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84115-1-1.html 上篇帖子: mongoDB研究笔记:复制集概述 下篇帖子: MongoDB中帐号管理(用户名密码设置)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表