为什么将 @Repository 放在 Spring Data JPA 接口之上?

Vov*_*syk 5 java spring jpa spring-data-jpa

我经常看到如下代码:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Long>
Run Code Online (Sandbox Code Playgroud)

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

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>
Run Code Online (Sandbox Code Playgroud)

它包含 @Repository自己,那么为什么我们需要在我们的界面上使用它呢?

Spring Data 文档@Repository在相关部分也没有说明任何内容,但是文档其他部分中的一些偶尔示例包含存在的代码片段@Repository,所以也许随着时间的推移发生了一些变化?

jwp*_*pol 1

我可能会怀念春天的“魔法”

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

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

我们不这样做。@Repository对扩展/实现的接口/类JpaRepository或扩展的一些其他预定义接口进行注释是多余的,Repository因为@EnableJpaRepositories它们扩展/实现了Repository接口。

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

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