【原】Spring與MongoDB集成:倉庫

  上一篇文章用介紹瞭如何配置spring-data-mongo鏈接到MongoDB上,如何建立MongoTemplate。MongoTemplate就至關於一個通用的倉庫,能夠持久化業務對象。spring

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

  clip_image001

  clip_image002

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

1、 爲何要用Repository?翻譯

  字面的翻譯是「倉庫」,就是對應的Bean的倉庫,它應該提供了Bean對象的基礎操做方法,好比save, delete等等。code

2、Repository在哪裏?orm

  如今用的spring-data-mongodb 1.2.1.RELEASE版本,看手冊用到了Repository接口,發現是在spring-data-common中定義的,還有相關的CurdRepository等都是這個包中定義的。爲了開發時方便,最好把spring-data-common一塊下載下來,API放在手邊查。 xml

3、怎麼實現Repository?對象

  org.springframework.data.mongodb.repository包,是有關倉庫定義的。 blog

  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步:

  一、 定義業務對象的Repository接口(方法);

  二、 實現業務對象的接口,默認後綴名是Impl;

  三、 定義業務對象,使用Repository(這一步是自動綁定的,但如何自動綁定,綁定到什麼程度,讓我花了很多時間)

  四、 修改POM.xml配置

 

下面來具體說說:

一、 定義Repository接口

  接口能夠直接擴展Repository<T,ID extends Serializable>,這個接口的目的是肯定業務對象類型和業務對象標識的類型。

  也能夠擴展MongoRepository<T,ID>接口,定義以下:

  clip_image004

  使用這兩個接口區別是:

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

  * MongoRepository,聲明瞭幾乎全部經常使用的方法(由CurdRepository, PagingAndSOringRepository和Repository提供的),你的倉庫也要實現這些方法。

二、 實現業務對象的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 );

三、 定義業務組件

  這裏說的業務組件是普遍意義的業務組件,指須要使用Repository的類。

public class CustomObjectClient {
    @Autowired
    public CustomRepository customRepository;

    public String getObjectName() {
        return customRepository.findByName( "XXX" );
    }
}

  把倉庫類型的成員用@Autowired標識,由Spring來完成Getter/Setter的功能。那麼這個值如何賦上的呢?來看第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按上面的路徑掃描,把找到的倉庫注入到業務組件中。

  而後,而後就是編寫你的業務代碼了~~~

相關文章
相關標籤/搜索