Spring Data JPA-- 执行过程源码分析

Spring Data JPA-- 执行过程源码分析

Spring Data Jpa 源码很少有人去分析,原因如下:

1)Spring Data Jpa 地位没有之前学习的框架⾼,⼤家习惯把它当成⼀个⼯具来⽤了,不愿意对它进进源码层次的解读
2)开发Dao接口(ResumeDao),接口的实现对象肯定是通过动态代理来完成的(增强),代理对象的产生过程追源码很难追,特别特别讲究技巧
源码剖析的主要的过程,就是代理对象产生的过程,我们发现resumeDao是⼀个代理对象,这个代理对象的类型是SimpleJapRepository
在这里插入图片描述

这个代理对象是怎么产生,过程怎样?

以往:如果要给⼀个对象产生代理对象,我们知道是在AbstractApplicationContext的refresh方法中,那么能不能在这个方法中找到什么我们当前场景的线索?
在这里插入图片描述
在这里插入图片描述

新的疑问又来了?

问题1: 为什么会给它指定为⼀个JpaRespositoryFactoryBean(getObject方法返回具体的对象)
问题2:指定这个FactoryBean是在什么时候发生的

首先解决问题2:

在这里插入图片描述

传入⼀个resumeDao就返回了⼀个已经指定class为JpaRepositoryFactoryBean的BeanDefinition对象了,那么应该在上图中的get时候就有了,所以断点进入

在这里插入图片描述

问题来了,什么时候put到map中去的?我们定位到了一个方法在做这件事

在这里插入图片描述
我们发现,传入该方法的时候,BeanDefintion中的class就已经被指定为FactoryBean了,那么观察该方法的调用栈
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上述追踪我们发现,<jpa:repository basePackage,扫描到的接口,在进行BeanDefintion注册时候,class会被固定的指定为JpaRepositoryFacotryBean至此,问题2 追踪完毕那么接下来,我们再来追踪问题1 JpaRespositoryFactoryBean是⼀个什么样的类
它是⼀个FactoryBean,我们重点关注FactoryBean的getObject方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由此可见,JdkDynamicAopProxy会生成⼀个代理对象类型为SimpleJpaRespository,而该对象的增强逻辑就在JdkDynamicAopProxy类的invoke方法中,至此,问题1追踪完毕。

疑问:这个代理对象类型SimpleJapRepository有什么特别的?

在这里插入图片描述
原来SimpleJpaRepository类实现了JpaRepository接⼝和JpaSpecificationExecutor接口
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值