为什么把@repository放在spring数据jpa接口之上?

fcy6dtqo  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(378)

我经常看到如下代码:

@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数据文档也没有提到 @Repository 在相关部分中,但文档其他部分的一些偶尔示例包含代码片段,其中 @Repository 是存在的,所以可能随着时间的推移有些改变了?

qq24tv8q

qq24tv8q1#

我可以错过一些关于Spring的“魔法”
很可能你错过了 @EnableJpaRepositories . 从doc:“默认情况下,将扫描带注解的配置类的包以查找spring数据存储库。”
为什么我们需要它在我们的界面上?
我们没有。对接口/类进行注解是多余的 @Repository 扩展/实现 JpaRepository 或者其他预定义的接口 Repository ,都是因为 @EnableJpaRepositories 以及它们扩展/实现 Repository 接口。
存储库中的相关引用(非 @Repository ):“一般目的是保存类型信息,并且能够在类路径扫描期间发现扩展此类型的接口,以便轻松创建springbean。”
现在为什么 SimpleJpaRepository 注解为 @Repository ? 因为它与(同样是同一个文档)“带注解的配置类的包”位于不同的包中。

mitkmikd

mitkmikd2#

很有趣的是,spring官方文档显示 @Repositoryinterface 在两个不同的例子中;尽管根本没必要这样。
为了好玩,我扫描了我们的源代码(大约100个微服务),发现有太多地方 @Repository 接口上存在。我认为这是因为人们面临着一些问题(比如 No qualifying bean of type... )只要开始在任何地方添加注解,就可以让代码正常工作。
我甚至怀疑自己是否认为最近版本的spring boot确实发挥了一些(奇怪的)魔力,但没有。经过一些测试,它只显示了明显的效果: @Repository 在接口上是无用的。理论上,spring可以发现某个接口扩展了它的 JPARepository ,请查看是否用 @Repository 并将其应用于它作为 @Bean . 但是
的实现 JPARepository 已经有那个注解了
不管怎么说,这没什么意义

相关问题