广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring Data JPA框架的Repository自定义实现详解
  • 839
分享到

Spring Data JPA框架的Repository自定义实现详解

2024-04-02 19:04:59 839人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1. spring Data Repository自定义实现1.1 自定义特殊repository1.2 配置类1.3 解决歧义1.4 手动装配1.5 自定义Base Repos

1. Spring Data Repository自定义实现

Spring Data提供了各种选项来创建查询方法,只需少量编码。但是当这些选项不能满足你的需求时,你也可以为资源库方法提供你自己的自定义实现。本节主要介绍如何做到这一点。

1.1 自定义特殊repository

要用自定义的功能实现来丰富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> {
}

1.2 配置类

如果你使用命名空间配置,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。

1.3 解决歧义

如果在不同的包中发现有多个类名匹配的实现,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实现定义的名字相匹配,并被用来代替第一个接口。

1.4 手动装配

如果你的自定义实现只使用基于注解的配置和自动装配,前面所示的方法很好用,因为它被当作任何其他Spring Bean。如果你的实现片段Bean需要装配到容器,你可以根据前文所述的约定来声明Bean并为其命名。然后,基础设施通过名称来引用手动定义的Bean定义,而不是自己创建一个。下面的例子展示了如何手动装配一个自定义的实现。

  • 例9 手动装配自定义实现类对象到容器
<repositories base-package="com.kkarma.repository" />
<beans:bean id="userRepositoryImpl" class="…">
  <!-- further configuration -->
</beans:bean>

1.5 自定义Base Repository

当你想定制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自定义实现详解的文章就介绍到这了,更多相关Spring Data JPA Repository内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring Data JPA框架的Repository自定义实现详解

本文链接: https://www.lsjlt.com/news/147555.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Data JPA框架的Repository自定义实现详解
    目录1. Spring Data Repository自定义实现1.1 自定义特殊repository1.2 配置类1.3 解决歧义1.4 手动装配1.5 自定义Base Repos...
    99+
    2022-11-13
  • Spring Data JPA框架的Repository怎么自定义
    本文小编为大家详细介绍“Spring Data JPA框架的Repository怎么自定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Data JPA框架的Repository怎么自...
    99+
    2023-06-30
  • Spring Data JPA框架快速入门之自定义Repository接口
    目录自定义Repository接口repository接口定义使用Repository接口自定义Repository接口 要定义一个repository接口,你首先需要自定义一个实体...
    99+
    2022-11-13
  • spring data jpa如何使用自定义repository实现类
    目录spring data jpa使用自定义repository实现类创建MyJpaRepository实现类创建MyJpaRepositoryFactoryBean配置JPAJpa...
    99+
    2022-11-12
  • spring-data-jpa使用自定义repository来实现原生sql
    目录使用自定义repository实现原生sql自定义Repository接口创建自定义RepositoryFactoryBeanSpringDataJpa原生SQL查询a.首先在S...
    99+
    2022-11-12
  • Spring Data JPA框架的核心概念与Repository接口详解
    目录1 核心概念CrudRepository接口PagingAndSortingRepository接口2 查询方法3 后续内容介绍1 核心概念 Spring Data存储库抽象的中...
    99+
    2022-11-13
  • spring-data-jpa怎么使用自定义repository来实现原生sql
    这篇文章给大家分享的是有关spring-data-jpa怎么使用自定义repository来实现原生sql的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用自定义repository实现原生sqlSpring D...
    99+
    2023-06-21
  • Spring Data Jpa如何实现自定义方法
    这篇文章将为大家详细讲解有关Spring Data Jpa如何实现自定义方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring Data Jpa 自定义方法的实现最近项目中用到...
    99+
    2023-06-22
  • 关于Spring Data Jpa 自定义方法实现问题
    目录Spring Data Jpa 自定义方法的实现自己的接口主接口我新建一个类来实现我自己的接口Spring Data Jpa自定义方法关键字Spring Data Jpa 自定义...
    99+
    2022-11-12
  • 使用Spring Data JPA如何实现自定义规则查询
    使用Spring Data JPA如何实现自定义规则查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、常用规则速查1   And    并且2   Or    &nbs...
    99+
    2023-05-31
    spring data jpa
  • Spring Data JPA实现查询结果返回map或自定义的实体类
    目录Spring Data JPA查询结果返回map或自定义的实体类1.工具类2.具体应用spingboot:jpa:Spring data jpa 返回map 结果集Spring ...
    99+
    2022-11-12
  • Spring Data Jpa返回自定义对象的3种方法实例
    目录方法一、简单查询直接new对象方法二、Service层使用EntityManager方法三、Dao层使用Map接收自定义对象总结tasks表对应的Entity @Entity @...
    99+
    2022-11-13
  • Java 自定义Spring框架与核心功能详解
    目录Spring核心功能结构核心容器spring-beans和spring-core模块spring-context模块spring-context-support模块spring-...
    99+
    2022-11-12
  • Spring@Component自定义注解实现详解
    目录引子Java里的注解注解是什么元注解注解的保存策略自定义注解注解元素注解处理器注解是什么自己写一个@Component注解准备工作代码实现准备@MyComponent注解准备一个...
    99+
    2022-11-13
  • 一文了解自定义MVC框架实现
    目录一、让中央控制器动态加载存储子控制器二、参数传递封装优化三、对于方法执行结果转发重定向优化四、框架配置可变一、让中央控制器动态加载存储子控制器 上期回顾,我们说明了自定义MVC工...
    99+
    2022-11-13
  • Python开发自定义Web框架的示例详解
    目录开发自定义Web框架1.开发Web服务器主体程序2.开发Web框架主体程序3.使用模板来展示响应内容4.开发框架的路由列表功能5.采用装饰器的方式添加路由6.电影列表页面的开发案...
    99+
    2022-11-11
  • 解析MyBatis源码实现自定义持久层框架
    目录自定义框架设计自定义框架实现使用端框架端自定义框架设计 使用端 : 提供核⼼配置⽂件: sqlMapConfig.xml : 存放数据源信息,引⼊mapper.xml Mappe...
    99+
    2022-11-13
  • Spring框架基于xml实现自动装配流程详解
    目录一、基于xml的自动装配之场景模拟:二、基于xml的自动装配之byType三、基于xml的自动装配之byName四、基于注解管理bean之功能分析五、基于注解管理bean之扫描组...
    99+
    2022-11-13
    Spring自动装配 Spring基于XML自动装配
  • 报表设计器中使用spring框架实现自定义数据集
    本篇文章给大家分享的是有关报表设计器中使用spring框架实现自定义数据集,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。spring是一个开源框架,是为了解决企业应用程序开发复...
    99+
    2023-06-03
  • Spring AOP 实现自定义注解的示例
    目录1. 注解如下:2. 切面自工作后,除了一些小项目配置事务使用过 AOP,真正自己写 AOP 机会很少,另一方面在工作后还没有写过自定义注解,一直很好奇注解是怎么实现他想要的功能...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作