Spring?Data?JPA框架的Repository自定義實(shí)現(xiàn)詳解
1. Spring Data Repository自定義實(shí)現(xiàn)
Spring Data提供了各種選項(xiàng)來創(chuàng)建查詢方法,只需少量編碼。但是當(dāng)這些選項(xiàng)不能滿足你的需求時(shí),你也可以為資源庫方法提供你自己的自定義實(shí)現(xiàn)。本節(jié)主要介紹如何做到這一點(diǎn)。
1.1 自定義特殊repository
要用自定義的功能實(shí)現(xiàn)來豐富repository庫,你必須首先定義一個(gè)片段接口和自定義功能的實(shí)現(xiàn),如下所示。
- 例1. 自定義接口
public interface CustomUserRepository { void customMethod(User user); }
- 例2. 自定義接口實(shí)現(xiàn)類
public class CustomUserRepositoryImpl implements CustomUserRepository { public void customMethod(User user) { // Your custom implementation } }
實(shí)現(xiàn)類本身并不依賴于Spring Data,它可以是一個(gè)普通的Spring Bean對(duì)象。因此,你可以使用標(biāo)準(zhǔn)的依賴注入行為來注入對(duì)其他Bean(如JdbcTemplate)的引用,參與到切面中進(jìn)行使用等等。
然后你可以讓你的repository接口擴(kuò)展片段接口,如下所示。
- 例3. 修改你的repository接口定義, 讓它擴(kuò)展你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { // Declare query methods here }
這樣就用你的repository接口擴(kuò)展自定義接口,結(jié)合了CRUD和自定義功能,并使其對(duì)客戶端提供服務(wù)。
Spring Data repositories是通過使用形成repository組合的片段來實(shí)現(xiàn)的。片段是基礎(chǔ)repository、功能方面(如QueryDsl),以及自定義接口和它們的實(shí)現(xiàn)。每當(dāng)你為你的repository接口添加一個(gè)接口,你就通過添加一個(gè)片段來增強(qiáng)組合?;A(chǔ)資源庫和資源庫方面的實(shí)現(xiàn)是由每個(gè)Spring Data模塊提供的。
下面的例子展示了自定義接口和它們的實(shí)現(xiàn)。
- 例4. 片段與它們的實(shí)現(xiàn)
public interface HumanRepository { void humanMethod(User user); } public class HumanRepositoryImpl implements HumanRepository { public void humanMethod(User user) { // Your custom implementation } } public interface ContactRepository { void contactMethod1(User user); User contactMethod2(User user); } public class ContactRepositoryImpl implements ContactRepository { public void contactMethod1(User user) { // Your custom implementation } public User contactMethod2(User user) { // Your custom implementation } }
下面的例子顯示了一個(gè)擴(kuò)展了CrudRepository的自定義倉庫的接口。
- 例5. 修改你的repository接口定義, 讓它擴(kuò)展多個(gè)你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, HumanRepository, ContactRepository { // Declare query methods here }
repository可以由多個(gè)自定義的實(shí)現(xiàn)組成,這些實(shí)現(xiàn)按其聲明的順序被導(dǎo)入。自定義實(shí)現(xiàn)的優(yōu)先級(jí)高于基礎(chǔ)實(shí)現(xiàn)和repository方面。這種排序可以讓你覆蓋基礎(chǔ)repository和方面的方法,并在兩個(gè)片段貢獻(xiàn)相同的方法簽名時(shí)解決歧義。repository片段不限于在單一repository接口中使用。多個(gè)repository可以使用一個(gè)片段接口,讓你在不同的repository中重復(fù)使用定制的內(nèi)容。
下面的例子顯示了一個(gè)repository片段和它的實(shí)現(xiàn)。
- 例6. 重寫save(…)方法的片段代碼
public interface CustomSave<T> { <S extends T> S save(S entity); } public class CustomSaveImpl<T> implements CustomSave<T> { public <S extends T> S save(S entity) { // Your custom implementation } }
- 例7 在repository接口中擴(kuò)展例6中定義的接口
interface UserRepository extends CrudRepository<User, Long>, CustomSave<User> { } interface PersonRepository extends CrudRepository<Person, Long>, CustomSave<Person> { }
1.2 配置類
如果你使用命名空間配置,repository基礎(chǔ)設(shè)施會(huì)嘗試通過掃描發(fā)現(xiàn)repository的包下面的類來自動(dòng)檢測(cè)自定義實(shí)現(xiàn)片段。這些類需要遵循命名空間元素的repository-impl-postfix屬性附加到片段接口名稱的命名慣例。這個(gè)后綴默認(rèn)為 Impl。下面的例子顯示了一個(gè)使用默認(rèn)后綴的repository和一個(gè)為后綴設(shè)置自定義值的repository。
XML文件的配置示例
<repositories base-package="com.kkarma.repository" /> <repositories base-package="com.kkarma.repository" repository-impl-postfix="MyImpl" />
前面例子中的第一個(gè)配置試圖查找一個(gè)叫做 com.kkatma.repository.CustomUserRepositoryImpl 的類,作為一個(gè)自定義的repository實(shí)現(xiàn)。第二個(gè)例子試圖查找 com.kkarma.repository.CustomUserRepositoryMyImpl。
1.3 解決歧義
如果在不同的包中發(fā)現(xiàn)有多個(gè)類名匹配的實(shí)現(xiàn),Spring Data會(huì)使用bean對(duì)象的名字來確定使用哪一個(gè)。
考慮到前面顯示的CustomUserRepository的以下兩個(gè)自定義實(shí)現(xiàn),第一個(gè)實(shí)現(xiàn)被使用。它的bean是customUserRepositoryImpl,與片段接口(CustomUserRepository)加上后綴Impl的名字相匹配。
- 例8 解決歧義實(shí)現(xiàn)方式
package com.kkarma.impl.one; class CustomUserRepositoryImpl implements CustomUserRepository { // Your custom implementation }
package com.kkarma.impl.two; @Component("specialCustomImpl") class CustomUserRepositoryImpl implements CustomUserRepository { // Your custom implementation }
如果你用 @Component("specialCustom")
來注解 UserRepository
接口,那么Bean的名字加上 Impl
就與 com.kkarma.impl.two
中為repository實(shí)現(xiàn)定義的名字相匹配,并被用來代替第一個(gè)接口。
1.4 手動(dòng)裝配
如果你的自定義實(shí)現(xiàn)只使用基于注解的配置和自動(dòng)裝配,前面所示的方法很好用,因?yàn)樗划?dāng)作任何其他Spring Bean。如果你的實(shí)現(xiàn)片段Bean需要裝配到容器,你可以根據(jù)前文所述的約定來聲明Bean并為其命名。然后,基礎(chǔ)設(shè)施通過名稱來引用手動(dòng)定義的Bean定義,而不是自己創(chuàng)建一個(gè)。下面的例子展示了如何手動(dòng)裝配一個(gè)自定義的實(shí)現(xiàn)。
- 例9 手動(dòng)裝配自定義實(shí)現(xiàn)類對(duì)象到容器
<repositories base-package="com.kkarma.repository" /> <beans:bean id="userRepositoryImpl" class="…"> <!-- further configuration --> </beans:bean>
1.5 自定義Base Repository
當(dāng)你想定制base repository的行為時(shí),上一節(jié)描述的方法需要定制每個(gè)repository的接口,以便所有的repository都受到影響。為了改變所有repository的行為,你可以創(chuàng)建一個(gè)擴(kuò)展持久化技術(shù)特定repository基類的實(shí)現(xiàn)。然后這個(gè)類作為repository代理的自定義基類,如下面的例子所示。
- 例10 自定義repository的基類
class MyRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> { private final EntityManager entityManager; MyRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); // Keep the EntityManager around to used from the newly introduced methods. this.entityManager = entityManager; } @Transactional public <S extends T> S save(S entity) { // implementation goes here } }
最后一步是讓Spring Data基礎(chǔ)設(shè)施意識(shí)到自定義的repository基類。在Java配置中,你可以通過使用@Enable${store}Repositories注解的repositoryBaseClass屬性來做到這一點(diǎn),如下面例子所示。
- 例11 使用JavaConfig配置自定義repository基類
@Configuration @EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class) class ApplicationConfiguration { … }
在XML命名空間中有一個(gè)相應(yīng)的屬性,如下面的例子中所示。
- 例12 使用XML配置自定義repository基類
<repositories base-package="com.kkarma.repository" base-class="….MyRepositoryImpl" />
到此這篇關(guān)于Spring Data JPA框架的Repository自定義實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Spring Data JPA Repository內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Spring Security的方法
Spring security,是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問控制框架。這篇文章主要介紹了SpringBoot集成Spring Security的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效
這篇文章主要介紹了重新啟動(dòng)IDEA時(shí)maven項(xiàng)目SSM框架文件變色所有@注解失效,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Mybatis和Mybatis-Plus時(shí)間范圍查詢方式
這篇文章主要介紹了Mybatis和Mybatis-Plus時(shí)間范圍查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java雙端隊(duì)列之ArrayDequeue原理講解
這篇文章主要為大家介紹了java雙端隊(duì)列之ArrayDequeue原理講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06