您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

程序员应知应会之Spring Data Jpa为什么不用写@Repository注解?

时间:2022-10-17 14:14:22  来源:  作者:活在信息时代

大家知道,在Springboot+Spring Data Jpa的项目里,dao层只需要继承JpaRepository接口,就可以实现MyBatis中@Repository+mApper的效果,不需要任何多余的配置,就可以将dao层注入bean。类似于这样:

public interface BookRepository extends JpaRepository<Book, Long>

这样一句话,就可以实现很多的增删改查效果,例如findAll(),findById()等等,可以说是非常的简单高效。

那么很多刚开始用Spring Data Jpa的同学就会很不理解,为什么这样一句话,就可以实现那么多的功能呢,不添加一个@Repository,心里总有些不踏实的感觉。

那么我们来看一下,Spring Data Jpa是怎么做到的。

一、JpaRepository的继承结构

首先我们来看看JpaRepository的继承结构。很容易看到JpaRepository的定义:

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>

可以看到JpaRepository继承了两个接口,一个
PagingAndSortingRepository和一个QueryByExampleExecutor。

这两个接口的定义分别是:

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID>

public interface QueryByExampleExecutor<T>

CrudRepository的定义为

public interface CrudRepository<T, ID> extends Repository<T, ID>

可以看到,最终的继承结果继承到了Repository里面。

而这一系列的继承,就为我们提供了

save(S entity);

saveAll(Iterable<S> entities);

findById(ID id);

existsById(ID id);

findAll();

findAllById(Iterable<ID> ids);

count();

deleteById(ID id);

delete(T entity);

deleteAll(Iterable<? extends T> entities);

deleteAll();

findOne(Example<S> example);

findAll(Example<S> example);

findAll(Example<S> example, Sort sort);

findAll(Example<S> example, Pageable pageable);

count(Example<S> example);

exists(Example<S> example);

findAll(Sort sort);

findAll(Pageable pageable);

等很多的功能。

 

二、JpaRepository为什么不需要@Repository注解

经过简单的Debug,我们就可以轻松定位到Spring注入bean的位置,是在
org.springframework.context.annotation包里面的


ClassPathScanningCandidateComponentProvider类中的

scanCandidateComponents方法里面,其中关键的代码在下面标蓝的

isCandidateComponent(metadataReader)判断里面。

 

而这个函数会将目标接口及其父接口一层层地往上对比,如果与该类自身的

includeFilters中的某个filter比中,则会返回true,意味着该实现将会作为bean被Spring管理起来,从而可以直接用@Autowired引用。

那么我们先来看看includeFilters里面到底有些什么东西,查询代码可以看到,该类在初始化的时候,添加了Component和ManagedBean。很显然,这与我们的Repository还是毫无关系的。事实上也是如此,在Spring启动时,第一遍扫描并没有把我们的BookRepository注入bean。

直到
org.springframework.data.repository.config包中的


RepositoryConfigurationDelegate执行的时候,才会开始扫描,而这个类执行的时候,会启动一个继承了ClassPathScanningCandidateComponentProvider类的RepositoryComponentProvider。

而在这个类里面,我们可以看到Repository最终被加载到了includeFilters里面。

 

此时,再扫描对应的包的时候,继承自Repository的所有dao层类,就被会注入成bean,供人们调用了。



Tags:Spring Data Jpa   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
分享Spring Data JPA的一些技巧和最佳实践
在现代软件开发中,Spring Boot已成为构建稳健和可扩展应用程序的主要框架。当涉及到与数据库的交互时,Java持久化API(JPA)提供了一种方便高效的方式来管理关系型数据。为了确保...【详细内容】
2023-10-04  Search: Spring Data Jpa  点击:(386)  评论:(0)  加入收藏
Spring Data JPA 和 MyBatis 谁更强?
我无法明确的告诉你JPA和MyBatis在国内哪个会更流行,我本人更喜欢JPA,但是我本人日常开发用MyBatis多。但是我的回答绝对不是在划水,而是我多年来自己的一点小小的思考。MyBati...【详细内容】
2023-08-22  Search: Spring Data Jpa  点击:(336)  评论:(0)  加入收藏
知乎高赞:Spring Data JPA 和 MyBatis 谁更强?
我无法明确的告诉你JPA和MyBatis在国内哪个会更流行,我本人更喜欢JPA,但是我本人日常开发用MyBatis多。但是我的回答绝对不是在划水,而是我多年来自己的一点小小的思考。MyBati...【详细内容】
2023-07-29  Search: Spring Data Jpa  点击:(259)  评论:(0)  加入收藏
二次封装 Spring Data JPA/MongoDB,打造更易用的数据访问层
最近我在做一个新项目,由于我们项目组一直使用的是 MongoDB 数据库,所以新项目我就打算上 Spring Data MongoDB 尝试一下,虽然我早就用过了 Spring Data JPA,对 Spring Data 的...【详细内容】
2022-11-22  Search: Spring Data Jpa  点击:(337)  评论:(0)  加入收藏
程序员应知应会之Spring Data Jpa为什么不用写@Repository注解?
大家知道,在Springboot+Spring Data Jpa的项目里,dao层只需要继承JpaRepository接口,就可以实现Mybatis中@Repository+mapper的效果,不需要任何多余的配置,就可以将dao层注入bean...【详细内容】
2022-10-17  Search: Spring Data Jpa  点击:(380)  评论:(0)  加入收藏
▌简易百科推荐
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(2)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(7)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条