为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

缥缈止盈 2022-06-04 15:19:42
我想知道 Spring Data JPA 框架如何为JpaRepository.如上图所示,有两个类正在实现JpaRepository。只是举个例子。我在在线演示示例中没有看到任何地方表明使用这个特定的类。
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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

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

作为其中的一部分(当@EnableJpaRepositories存在时),Spring Data 会扫描您的类路径以查找所有使用@Repository. 当您的存储库接口扩展JpaRepositoryCrudRepository或其任何派生)时,就会出现这种情况。

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

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


查看完整回答
反对 回复 2022-06-04
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

Spring dataJpaRepositoryFactory默认使用为你的存储库找到正确的实现。您可以通过配置定义自定义工厂@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);

}


查看完整回答
反对 回复 2022-06-04
?
三国纷争

TA贡献1804条经验 获得超7个赞

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



查看完整回答
反对 回复 2022-06-04
  • 3 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信