首页 > 解决方案 > 为什么将 @Repository 放在 Spring Data JPA 接口之上?

问题描述

我经常看到如下代码:

@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存在的代码片段,所以可能随着时间的推移发生了一些变化?

标签: javaspringjpaspring-data-jpa

解决方案


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

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

为什么我们需要在我们的界面上使用它?

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

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

现在为什么 thenSimpleJpaRepository用 注释@Repository?因为它与(再次是同一个文档)“带注释的配置类的包”位于不同的包中。


推荐阅读