【问题标题】:Why put @Repository on top of Spring Data JPA interfaces?为什么将 @Repository 放在 Spring Data JPA 接口之上?
【发布时间】:2021-01-05 09:29:57
【问题描述】:

我经常看到如下代码:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long>

我的问题是为什么我们需要这个 @Repository 注释?
我理解@Repository 存在的原因,以及为什么我们可能需要加入某些课程。
但是类没有从 Java 中的接口继承注解。当然,我可能会错过一些关于 Spring 'magic' 的内容,但默认的 JPA 实现类如下:

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>

它本身就包含@Repository,那么为什么我们的界面需要它呢?

Spring Data 文档在相关部分也没有提及 @Repository,但文档其他部分的一些偶尔示例包含存在 @Repository 的代码片段,所以随着时间的推移可能发生了一些变化?

【问题讨论】:

    标签: java spring jpa spring-data-jpa


    【解决方案1】:

    有趣的是,spring official documentation 在两个不同的示例中在interface 上显示@Repository;虽然根本不需要这个。

    为了好玩,我扫描了我们的源代码(大约 100 个微服务),发现在界面上出现@Repository 的地方太多。我认为这是因为人们面临某些类型的问题(例如No qualifying bean of type...),然后开始在任何可能的地方添加注释,以使代码正常工作。

    我什至怀疑自己是否认为最近版本中的弹簧靴确实做了一些(奇怪的)魔法,但没有。经过一些测试,它只是显示了明显的:@Repository 在接口上没用。理论上,Spring 可以发现某个接口扩展了它的JPARepository,看到它用@Repository 进行了注释,并将相同的内容应用于它将作为@Bean 提供的某个类。但是

    • JPARepository 的实现已经有这个注解

    • 反正这没什么意义

    【讨论】:

      【解决方案2】:

      我可能会错过一些关于 Spring 'magic' 的东西

      您很可能会错过@EnableJpaRepositories。来自doc: "将扫描带注释的配置类的包以查找 Spring Data 存储库默认情况下。"

      为什么我们的界面需要它?

      我们没有。使用扩展/实现JpaRepository 或扩展Repository 的一些其他预定义接口来注释接口/类是多余的,这都是因为@EnableJpaRepositories 以及它们扩展/实现Repository 接口的事实。

      来自Repository(不是@Repository)的相关引用:“一般目的是保存类型信息以及能够在类路径扫描期间发现扩展此接口的接口,以便轻松创建Spring bean强>。”

      现在为什么SimpleJpaRepository@Repository 注释?因为它与(再次是相同的doc)“带注释的配置类的包”位于不同的包中。

      【讨论】:

      • @EnableJpaRepositories@Repository 没有任何关系。我建议你重新阅读问题
      • 在这个特殊的例子中它肯定有!他们注释了SimpleJpaRepository,因为EnableJpaRepository 不能覆盖这个类所在的包。想象一下,你想直接使用SimpleJpaRepository,如果没有@Repository 在这个类之上,你怎么可能做到这一点?
      • 您的评论是关于class 的注释,而问题是关于interface。我会重复@Repository@EnableJPARepositories 无关。第一个是花哨的@Component,第二个是spring jpa特定接口的扩展扫描存在的地方。
      猜你喜欢
      • 2021-12-22
      • 2012-01-27
      • 2016-07-21
      • 1970-01-01
      • 2019-05-28
      • 2014-08-31
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多