Spring?Data?JPA框架快速入門之自定義Repository接口
自定義Repository接口
要定義一個repository接口,你首先需要自定義一個實體類專用的Repository接口。該接口必須擴展 Repository,并將其類型指定為實體類和實體類的 ID 類型。
如果你想為該實體類資源類型開放CRUD方法,請直接繼承CrudRepository而不是Repository。
repository接口定義
通常,你的repository接口會擴展Repository、CrudRepository或PagingAndSortingRepository。
如果你不想擴展Spring Data接口,你也可以用@RepositoryDefinition來注解你的repository接口。
繼承CrudRepository接口會公開一套完整的CRUD方法來操作你的實體類對象, 如果你希望自行決定暴露哪些方法,可以從CrudRepository中復制你想暴露的方法到你的自定義的repository接口中即可。
通過以上的操作可以讓你在所提供的Spring Data Repositories功能的基礎上定義自己的repository接口抽象。
下面通過實例展示了如何有選擇地對外開放某些指定的CRUD方法(本例中對外開放findById和save接口方法)。
選擇性對外暴露指定CRUD方法讓其他人使用
@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {
Optional<T> findById(ID id);
<S extends T> S save(S entity);
}
interface UserRepository extends MyBaseRepository<User, Long> {
User findByEmailAddress(EmailAddress emailAddress);
}在前面的例子中,我們?yōu)樗械膔epository定義了一個通用的基礎接口,并暴露了findById(…)以及save(…)方法。
這些方法被路由到Spring Data提供的你所選擇的store的基礎repository實現(xiàn)(例如,如果你使用JPA,實現(xiàn)就是SimpleJpaRepository),因為它們與CrudRepository中的方法簽名一致。所以UserRepository現(xiàn)在可以保存用戶,通過ID找到單個用戶,并觸發(fā)查詢,通過電子郵件地址找到用戶對象。
自定義的中間repository接口上需要添加@NoRepositoryBean。但是請?zhí)貏e注意,在所有Spring Data需要在運行時動態(tài)創(chuàng)建實例的repository接口上一定不要添加該注解。
就比如上面的示例代碼,
- MyBaseRepository就是中間repository接口, 我們需要使用他來自定義對外開放哪些CRUD方法,需要添加@NoRepositoryBean注解, 這個注解的意思就是一個標記,為了通知JPA不要創(chuàng)建該接口的bean對象
這個@NoRepositoryBean就是用在中間repository接口上的, 但是從中間接口派生出具體的repository接口, 對應上面的示例代碼就是UserRepository接口, 在這個接口上一定不要添加@NoRepositoryBean注解,如果添加了, 這個UserRepository接口的bean對象就不會注入到容器中了
使用Repository接口
在多個Spring Data模塊中使用Repository接口
在你的應用程序中使用一個唯一的的Spring Data模塊使事情變得簡單,因為定義范圍內(nèi)的所有存儲庫接口都綁定到Spring Data模塊。有時,應用程序需要使用一個以上的Spring Data模塊。在這種情況下,存儲庫定義必須區(qū)分持久化技術。當它檢測到類classpath路徑下有多個repository factory時,Spring Data會進入嚴格的respository配置模式。嚴格的配置使用respository或域類的細節(jié)來決定respository定義的Spring Data模塊綁定。
如果資源庫定義擴展了特定模塊的資源庫,那么它就是特定Spring Data模塊的有效候選者。
如果域類被注解了特定模塊的類型注解,它就是特定Spring Data模塊的有效候選者。Spring Data模塊接受第三方注解(如JPA的@Entity)或提供自己的注解(如Spring Data MongoDB和Spring Data Elasticsearch的@Document)。
下面的例子顯示了一個使用特定模塊接口的存儲庫(本例中為 JPA)。
- 例1. 使用module-specific接口的repository定義
interface MyRepository extends JpaRepository<User, Long> { }
@NoRepositoryBean
interface MyBaseRepository<T, ID> extends JpaRepository<T, ID> { … }
interface UserRepository extends MyBaseRepository<User, Long> { … }
MyRepository和UserRepository在其類型層次上擴展了JpaRepository。它們是Spring Data JPA模塊的有效候選者。
下面的例子顯示了一個使用通用接口的repository接口。
- 例2. 使用通用接口的repository定義
interface AmbiguousRepository extends Repository<User, Long> { … }
@NoRepositoryBean
interface MyBaseRepository<T, ID> extends CrudRepository<T, ID> { … }
interface AmbiguousUserRepository extends MyBaseRepository<User, Long> { … }
AmbiguousRepository和AmbiguousUserRepository在其類型層次結構中只擴展了Repository和CrudRepository。雖然在使用唯一的Spring Data模塊時,這很好,但多個模塊無法區(qū)分這些repository接口應該被綁定到哪個特定的Spring Data。
下面的例子顯示了一個使用帶注解的領域類的repository接口。
- 例3. 使用帶注解的domain類的repository定義
interface PersonRepository extends Repository<Person, Long> { … }
@Entity
class Person { … }
interface UserRepository extends Repository<User, Long> { … }
@Document
class User { … }
PersonRepository引用了Person,它被JPA的@Entity注解所注解,所以這個repository接口顯然屬于Spring Data JPA。UserRepository引用了User,它被Spring Data MongoDB的@Document注釋所注解。
下面的壞例子顯示了一個使用混合注解的domain類的repository接口。
- 例4. 使用混合注解的領域類的repository定義
interface JpaPersonRepository extends Repository<Person, Long> { … }
interface MongoDBPersonRepository extends Repository<Person, Long> { … }
@Entity
@Document
class Person { … }
這個例子展示了一個同時使用JPA和Spring Data MongoDB注解的領域類。它定義了兩個repository接口:JpaPersonRepository和MongoDBPersonRepository。一個用于JPA,另一個用于MongoDB的使用。Spring Data不再能夠區(qū)分這些repository接口庫,這導致了未定義的行為。
repository接口類型細節(jié)和區(qū)分domian類注釋用于嚴格的repository接口配置,以確定特定Spring Data模塊的repository接口候選者。在同一domain類型上使用多個持久化技術的特定注解是可能的,并且能夠在多個持久化技術中重復使用domian類型。然而,Spring Data就不能再確定一個唯一的模塊來綁定repository接口了。
區(qū)分repository的最后一個方法是通過對repository接口基礎包的掃描?;A包定義了掃描repository接口定義的起點,這意味著將repository接口的定義放在適當?shù)陌小DJ情況下,注解驅動的配置使用配置類的包。基于XML的配置中的基礎包是強制性的。
下面的例子顯示了注釋驅動的基本包的配置。
- 例5. 注釋驅動的基礎包配置
@EnableJpaRepositories(basePackages = "com.acme.repositories.jpa")
@EnableMongoRepositories(basePackages = "com.acme.repositories.mongo")
public class Configuration {
}到此這篇關于Spring Data JPA框架快速入門之自定義Repository接口的文章就介紹到這了,更多相關Spring Data JPA Repository接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot集成Redis并實現(xiàn)主從架構的實踐
本文主要和大家分享一下在springboot中如何集成redis,并實現(xiàn)主從架構,進行數(shù)據(jù)的簡單存儲,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
Spring?IOC容器Bean注解創(chuàng)建對象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
Elasticsearch?計數(shù)分詞中的token使用實例
這篇文章主要為大家介紹了Elasticsearch?計數(shù)分詞中的token使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式
這篇文章主要介紹了Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring中的@RestControllerAdvice注解使用方法解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用方法解析,@RestControllerAdvice是Controller的增強 常用于全局異常的捕獲處理 和請求參數(shù)的增強,需要的朋友可以參考下2024-01-01

