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, 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, HumanRepository, ContactRepository { // Declare query methods here }
repository可以由多個自定義的實現組成,這些實現按其宣告的順序被匯入。自定義實現的優先順序高於基礎實現和repository方面。這種排序可以讓你覆蓋基礎repository和方面的方法,並在兩個片段貢獻相同的方法簽名時解決歧義。repository片段不限於在單一repository介面中使用。多個repository可以使用一個片段介面,讓你在不同的repository中重複使用定製的內容。
下面的例子顯示了一個repository片段和它的實現。
例6. 重寫save(…)方法的片段程式碼
public interface CustomSave{ S save(S entity); } public class CustomSaveImplimplements CustomSave{ public S save(S entity) { // Your custom implementation } }
例7 在repository介面中擴充套件例6中定義的介面
interface UserRepository extends CrudRepository, CustomSave{ } interface PersonRepository extends CrudRepository, CustomSave{ }
如果你使用名稱空間配置,repository基礎設施會嘗試透過掃描發現repository的包下面的類來自動檢測自定義實現片段。這些類需要遵循名稱空間元素的repository-impl-postfix屬性附加到片段介面名稱的命名慣例。這個字尾預設為 Impl。下面的例子顯示了一個使用預設字尾的repository和一個為字尾設定自定義值的repository。
如果在不同的包中發現有多個類名匹配的實現,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"></repositories> <beans:bean id="userRepositoryImpl" class="…"> <!-- further configuration --> </beans:bean>
當你想定製base repository的行為時,上一節描述的方法需要定製每個repository的介面,以便所有的repository都受到影響。為了改變所有repository的行為,你可以建立一個擴充套件持久化技術特定repository基類的實現。然後這個類作為repository代理的自定義基類,如下面的例子所示。
例10 自定義repository的基類
class MyRepositoryImplextends SimpleJpaRepository{ 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 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"></repositories></s></person></user></s></t></s></t>
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2891929/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring Data JPA 實現聯表查詢Spring
- @Query註解的用法(Spring Data JPA)Spring
- Spring Data JpaSpring
- Spring Data JPA 實現多表關聯查詢Spring
- Spring Data JPA之Spring Data JPA快速入門(三)Spring
- 使用Spring Data JPA實現DDD聚合的動態投影Spring
- Spring Data JPA 的使用Spring
- Spring Data JPA中實現更新插入三種方法Spring
- Spring Data Jpa APISpringAPI
- Spring Data Jpa 複雜查詢總結 (多表關聯 以及 自定義分頁 )Spring
- Spring Boot:整合Spring Data JPASpring Boot
- Spring Data JPA專案實戰(下)Spring
- SpringMVC+Spring Data JPA實現增刪改查操作SpringMVC
- 使用Spring Data JPA實現持久化層的簡化開發Spring持久化
- Spring Data JPA系列5:讓IDEA自動幫你寫JPA實體定義程式碼SpringIdea
- Spring Data JPA中TransactionInterceptorSpring
- Spring Data JPA中ConfigurableTransactionManagerSpring
- spring data jpa查詢Spring
- SpringBoot整合Spring Data JPASpring Boot
- Spring Data JPA:解析CriteriaQuerySpring
- Spring Data JPA:解析SimpleJpaRepositorySpring
- Spring Data JPA:解析CriteriaBuilderSpringUI
- Spring Data JPA + QueryDSL實現CRUD和複雜查詢案例Spring
- Spring框架系列(12) - Spring AOP實現原理詳解之JDK代理實現Spring框架JDK
- Spring框架系列(11) - Spring AOP實現原理詳解之Cglib代理實現Spring框架CGLib
- Spring Data JPA原始碼案例Spring原始碼
- Spring Data JPA REST Query CriteriaSpringREST
- Spring Data JPA簡單使用Spring
- Spring Data JPA的簡單入門Spring
- Spring 實現策略模式--自定義註解方式解耦if...elseSpring模式解耦
- Spring框架系列(9) - Spring AOP實現原理詳解之AOP切面的實現Spring框架
- 【朝花夕拾】Android自定義View篇之(四)自定義View的三種實現方式及自定義屬性詳解AndroidView
- Spring Data JPA系列2:SpringBoot整合JPA詳細教程,快速在專案中熟練使用JPASpring Boot
- JPA Repository之JpaRepositoryImplementation
- Spring框架系列(10) - Spring AOP實現原理詳解之AOP代理的建立Spring框架
- Spring Data JPA中事務ReactiveTransactionManagerSpringReact
- Spring Data JPA 參考文件三Spring
- 一文搞定 Spring Data JPASpring