我经常看到如下代码:
@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
是存在的,所以可能随着时间的推移有些改变了?
2条答案
按热度按时间qq24tv8q1#
我可以错过一些关于Spring的“魔法”
很可能你错过了
@EnableJpaRepositories
. 从doc:“默认情况下,将扫描带注解的配置类的包以查找spring数据存储库。”为什么我们需要它在我们的界面上?
我们没有。对接口/类进行注解是多余的
@Repository
扩展/实现JpaRepository
或者其他预定义的接口Repository
,都是因为@EnableJpaRepositories
以及它们扩展/实现Repository
接口。存储库中的相关引用(非
@Repository
):“一般目的是保存类型信息,并且能够在类路径扫描期间发现扩展此类型的接口,以便轻松创建springbean。”现在为什么
SimpleJpaRepository
注解为@Repository
? 因为它与(同样是同一个文档)“带注解的配置类的包”位于不同的包中。mitkmikd2#
很有趣的是,spring官方文档显示
@Repository
在interface
在两个不同的例子中;尽管根本没必要这样。为了好玩,我扫描了我们的源代码(大约100个微服务),发现有太多地方
@Repository
接口上存在。我认为这是因为人们面临着一些问题(比如No qualifying bean of type...
)只要开始在任何地方添加注解,就可以让代码正常工作。我甚至怀疑自己是否认为最近版本的spring boot确实发挥了一些(奇怪的)魔力,但没有。经过一些测试,它只显示了明显的效果:
@Repository
在接口上是无用的。理论上,spring可以发现某个接口扩展了它的JPARepository
,请查看是否用@Repository
并将其应用于它作为@Bean
. 但是的实现
JPARepository
已经有那个注解了不管怎么说,这没什么意义