java - 如何从自定义实现中引用 'normal' spring 数据仓库?

标签 java spring-data spring-data-jpa

我想用自定义实现扩展一个 JpaRepository,所以我添加了一个 MyRepositoryCustom 接口(interface)和一个扩展该接口(interface)的 MyRepositoryImpl 类。

有没有办法在我的自定义类中从 JpaRepository 调用方法?

注意:这也作为对 https://stackoverflow.com/a/11881203/40064 的评论被问及, 但我认为这很常见,值得单独提出一个问题。

最佳答案

tl;dr

要将核心存储库接口(interface)注入(inject)自定义实现,请注入(inject) Provider<RepositoryInterface>进入自定义实现。

详情

实现该功能的核心挑战是正确设置依赖注入(inject),因为您将要在要扩展的对象和扩展之间创建循环依赖。然而,这可以通过以下方式解决:

interface MyRepository extends Repository<DomainType, Long>, MyRepositoryCustom {
  // Query methods go here
}

interface MyRepositoryCustom {
  // Custom implementation method declarations go here
}

class MyRepositoryImpl implements MyRepositoryCustom {

  private final Provider<MyRepository> repository;

  @Autowired
  public MyRepositoryImpl(Provider<MyRepository> repository) {
    this.repository = repository;
  }

  // Implement custom methods here
}

这里最重要的部分是使用 Provider<MyRepository>这将导致 Spring 为该依赖项创建延迟初始化的代理 ,即使它正在为 MyRepository 创建实例首先。在自定义方法的实现中,您可以使用 ….get() 访问实际的 bean。 -方法。

Provider是来自 @Inject 的接口(interface)JSR,因此是一个标准化的接口(interface),需要对该 API JAR 的额外依赖。如果你只想坚持使用 Spring,你可以使用 ObjectFactory作为替代界面,但获得完全相同的行为。

关于java - 如何从自定义实现中引用 'normal' spring 数据仓库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361275/

相关文章:

java - 如何使用 JNA 将 com.sun.jna.Structure 从 Java 传递到 C 中的结构

java - Spring Boot super JAR : cannot be resolved to absolute file path because it does not reside in the file system

mongodb - Spring Data 的 TTL 索引定义

java - 使用 AbstractRoutingDataSource 并尝试设置多个数据源时出现 Spring 引导错误

spring-data - 不使用注解的spring-data-mongodb序列化策略的定制

java - Android:无法请求以反斜杠结尾的 URL

JAVA:如何根据属性值合并 arrayList 中的对象?

java - 使用spring jpa时抛出NonUniqueResultException "findtop"

java - 如何使用分页在 Spring Data JPA 中通过 SELECT 子句的别名对投影进行排序?

Java 多态性与 ArrayList