Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring如何在运行时获取接口的实现_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

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

Java spring如何在运行时获取接口的实现,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我想知道SpringDataJPA框架是如何为JpaRepository实现的 如上图所示,有两个类正在实现JpaRepository。举个例子 在在线演示示例中,我没有看到任何地方表明使用此特定类。Spring数据默认使用JpaRepositoryFactory为存储库找到正确的实现。您可以通过config@enableJParepositions(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)定义自定义工厂 以下是

我想知道SpringDataJPA框架是如何为
JpaRepository
实现的

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


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

Spring数据默认使用
JpaRepositoryFactory
为存储库找到正确的实现。您可以通过config
@enableJParepositions(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class)定义自定义工厂

以下是
JpaRepositoryFactory
选择实现的方法

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

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

@sairamch04说的没问题。我只能补充一点,当通过
@query
注释或使用标准jpa方法名定义查询时,将创建一个代理对象来执行查询。这些代理的创建是在factory对象中进行的,例如前面提到的
JpaRepositoryFactory
。否则,它将返回到实现,例如
SimpleJpaRepository
。有关存储库的更多信息,您可以在SpringDataCommons中调用
RepositoryFactorySupport.getReporitory()
方法。

,以提供更广泛的解释,以防有所帮助

当应用程序启动时,Spring初始化应用程序上下文;i、 e.组成应用程序的bean集


作为这项工作的一部分(当
@EnableJpaRepositories
存在时),Spring数据会扫描您的类路径,以查找用
@Repository
注释的所有接口。当您的存储库接口扩展了
JpaRepository
(或
crudepository
或其任何派生版本)时,就会出现这种情况

对于找到的每个接口,它将注册一个“存储库工厂”bean。一种特殊类型的bean,知道如何创建其他bean。在本例中,它知道如何为存储库接口实例化实现

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


HTH

Spring数据扫描您的类路径!!你能告诉我那个类吗?这个代码是由
@EnableJpaRepositories
调用的
RepositoryComponentProvider
是一个类路径扫描程序,用于查找用@Repository注释的类。
private boolean isQueryDslExecutor(Class<?> repositoryInterface) {

    return QUERY_DSL_PRESENT && QuerydslPredicateExecutor.class.isAssignableFrom(repositoryInterface);
}