上一篇文章用介紹了如何配置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按上面的路徑掃描,把找到的倉庫注入到業務組件中。
然后,然后就是編寫你的業務代碼了~~~




