【原】Spring與MongoDB集成:倉庫


  上一篇文章用介紹了如何配置spring-data-mongo連接到MongoDB上,如何創建MongoTemplate。MongoTemplate就相當於一個通用的倉庫,可以持久化業務對象。

  在spring-data-mongo 1.2.1.RELEASE版的手冊中,有兩個大章節介紹了和倉庫相關的內容,可見其重要。

  clip_image001

  clip_image002

曾經有過一些疑問,整理一下:

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>接口,定義如下:

  clip_image004

  使用這兩個接口區別是:

  * Repository,直接聲明自己的倉庫接口,無須管其它。使用的時候,對象的一般存取直接使用MongoTemplate,而專門的方法才使用倉庫中的方法;

  * MongoRepository,聲明了幾乎所有常用的方法(由CurdRepository, PagingAndSOringRepository和Repository提供的),你的倉庫也要實現這些方法。

2、 實現業務對象的Repository接口

  有了接口定義就要實現它。

  如果定義的接口只是擴展了Repository,那么只需實現自定義的業務方法。

  如果定義的接口擴展了MongoRepository,就要實現所有相關的基礎方法。這里要注意,之所以使用Repository,就是避免編寫大量相似的模板代碼,如果自己實現這些方法就失去使用Repository的意義了。

  spring-data-mongo在在org.springframework.data.mongodb.repository.
  support包中提供了SimpleMongoRepository和QueryDslMongoRepository類,專門用來實現這些基礎方法。

  clip_image006

  所以,你的業務倉庫類應該是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按上面的路徑掃描,把找到的倉庫注入到業務組件中。

  然后,然后就是編寫你的業務代碼了~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM