您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Spring Data JPA框架的Repository怎么自定義”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring Data JPA框架的Repository怎么自定義”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
Spring Data提供了各種選項來創建查詢方法,只需少量編碼。但是當這些選項不能滿足你的需求時,你也可以為資源庫方法提供你自己的自定義實現。本節主要介紹如何做到這一點。
要用自定義的功能實現來豐富repository庫,你必須首先定義一個片段接口和自定義功能的實現,如下所示。
例1. 自定義接口
public interface CustomUserRepository { void customMethod(User user); }
例2. 自定義接口實現類
public class CustomUserRepositoryImpl implements CustomUserRepository { public void customMethod(User user) { // Your custom implementation } }
實現類本身并不依賴于Spring Data,它可以是一個普通的Spring Bean對象。因此,你可以使用標準的依賴注入行為來注入對其他Bean(如JdbcTemplate)的引用,參與到切面中進行使用等等。
然后你可以讓你的repository接口擴展片段接口,如下所示。
例3. 修改你的repository接口定義, 讓它擴展你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository { // Declare query methods here }
這樣就用你的repository接口擴展自定義接口,結合了CRUD和自定義功能,并使其對客戶端提供服務。
Spring Data repositories是通過使用形成repository組合的片段來實現的。片段是基礎repository、功能方面(如QueryDsl),以及自定義接口和它們的實現。每當你為你的repository接口添加一個接口,你就通過添加一個片段來增強組合。基礎資源庫和資源庫方面的實現是由每個Spring Data模塊提供的。
下面的例子展示了自定義接口和它們的實現。
例4. 片段與它們的實現
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 } }
下面的例子顯示了一個擴展了CrudRepository的自定義倉庫的接口。
例5. 修改你的repository接口定義, 讓它擴展多個你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, HumanRepository, ContactRepository { // Declare query methods here }
repository可以由多個自定義的實現組成,這些實現按其聲明的順序被導入。自定義實現的優先級高于基礎實現和repository方面。這種排序可以讓你覆蓋基礎repository和方面的方法,并在兩個片段貢獻相同的方法簽名時解決歧義。repository片段不限于在單一repository接口中使用。多個repository可以使用一個片段接口,讓你在不同的repository中重復使用定制的內容。
下面的例子顯示了一個repository片段和它的實現。
例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接口中擴展例6中定義的接口
interface UserRepository extends CrudRepository<User, Long>, CustomSave<User> { } interface PersonRepository extends CrudRepository<Person, Long>, CustomSave<Person> { }
如果你使用命名空間配置,repository基礎設施會嘗試通過掃描發現repository的包下面的類來自動檢測自定義實現片段。這些類需要遵循命名空間元素的repository-impl-postfix屬性附加到片段接口名稱的命名慣例。這個后綴默認為 Impl。下面的例子顯示了一個使用默認后綴的repository和一個為后綴設置自定義值的repository。
XML文件的配置示例
<repositories base-package="com.kkarma.repository" /> <repositories base-package="com.kkarma.repository" repository-impl-postfix="MyImpl" />
前面例子中的第一個配置試圖查找一個叫做 com.kkatma.repository.CustomUserRepositoryImpl 的類,作為一個自定義的repository實現。第二個例子試圖查找 com.kkarma.repository.CustomUserRepositoryMyImpl。
如果在不同的包中發現有多個類名匹配的實現,Spring Data會使用bean對象的名字來確定使用哪一個。
考慮到前面顯示的CustomUserRepository的以下兩個自定義實現,第一個實現被使用。它的bean是customUserRepositoryImpl,與片段接口(CustomUserRepository)加上后綴Impl的名字相匹配。
例8 解決歧義實現方式
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實現定義的名字相匹配,并被用來代替第一個接口。
如果你的自定義實現只使用基于注解的配置和自動裝配,前面所示的方法很好用,因為它被當作任何其他Spring Bean。如果你的實現片段Bean需要裝配到容器,你可以根據前文所述的約定來聲明Bean并為其命名。然后,基礎設施通過名稱來引用手動定義的Bean定義,而不是自己創建一個。下面的例子展示了如何手動裝配一個自定義的實現。
例9 手動裝配自定義實現類對象到容器
<repositories base-package="com.kkarma.repository" /> <beans:bean id="userRepositoryImpl" class="…"> <!-- further configuration --> </beans:bean>
當你想定制base repository的行為時,上一節描述的方法需要定制每個repository的接口,以便所有的repository都受到影響。為了改變所有repository的行為,你可以創建一個擴展持久化技術特定repository基類的實現。然后這個類作為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基礎設施意識到自定義的repository基類。在Java配置中,你可以通過使用@Enable${store}Repositories注解的repositoryBaseClass屬性來做到這一點,如下面例子所示。
例11 使用JavaConfig配置自定義repository基類
@Configuration @EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class) class ApplicationConfiguration { … }
在XML命名空間中有一個相應的屬性,如下面的例子中所示。
例12 使用XML配置自定義repository基類
<repositories base-package="com.kkarma.repository" base-class="….MyRepositoryImpl" />
讀到這里,這篇“Spring Data JPA框架的Repository怎么自定義”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。