Spring如何在运行时获取接口的实现

问题描述 投票:0回答:3

[我想知道Spring Data JPA框架如何选择JpaRepository的实现。

enter image description here

如上图所示,有两个类正在实现JpaRepository。仅举一个例子。

我在在线演示示例中没有看到任何指示使用此特定类的地方。

java spring hibernate jpa spring-data-jpa
3个回答
1
投票

@ sairamch04说的没事。我只能补充一点,当通过@Query注释或使用标准jpa方法名称定义查询时,将创建一个代理对象来执行查询。这些代理的创建在工厂对象中,例如提到的JpaRepositoryFactory。否则,它会退回到诸如SimpleJpaRepository的实现。有关存储库的更多信息,可以在spring-data-commons中调用RepositoryFactorySupport.getReporitory()方法。


2
投票

如果有帮助的话,给出更广泛的解释。

当您的应用程序启动时,Spring初始化应用程序上下文;即组成您的应用程序的一组bean。

作为其一部分(当存在@EnableJpaRepositories时),Spring Data会扫描您的类路径以查找所有带@Repository注释的接口。当您的存储库接口扩展了JpaRepository(或CrudRepository或其任何派生)时,将是这种情况。

对于找到的每个接口,它将注册一个“ Repository Factory” bean。一种特殊的bean,它知道如何创建其他bean。在这种情况下,它知道如何实例化存储库接口的实现。

第一次遇到代码“自动关联”您的存储库接口,这触发了工厂bean实例化一个特殊的代理类,该代理类(1)实现您的存储库接口,(2)以所选实现类的实例为目标,通常SimpleJpaRepository(如@ sairamch04解释)。代理实际上是连接到您的调用代码中的对象(因为它实现了存储库接口)。因此,当您调用存储库接口时,您实际上是在调用代理并将代理转发到实现中。它也可以转发到其他对象,具体取决于您是否已自定义存储库或选择使用QueryDSL。但是在简单情况下,调用将转发到实现对象SimpleJpaRepository

HTH


1
投票

Spring数据默认情况下使用JpaRepositoryFactory为您的存储库找到正确的实现。您可以通过配置@EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class)

定义自定义工厂

JpaRepositoryFactory选择实现的方式在这里>>

@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {

    if (isQueryDslExecutor(metadata.getRepositoryInterface())) {
        return QuerydslJpaRepository.class;
    } else {
        return SimpleJpaRepository.class;
    }
}

isQueryDslExecutor的源代码开始,如果您的存储库实现了QuerydslPredicateExecutor,那么将使用QuerydslJpaRepository实现。

private boolean isQueryDslExecutor(Class<?> repositoryInterface) {

    return QUERY_DSL_PRESENT && QuerydslPredicateExecutor.class.isAssignableFrom(repositoryInterface);
}
© www.soinside.com 2019 - 2024. All rights reserved.