Spring Data JPA 执行过程源码分析

Posted 丿涛哥哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data JPA 执行过程源码分析相关的知识,希望对你有一定的参考价值。

Spring Data JPA 执行过程源码分析

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

1)Spring Data Jpa 地位没有之前学习的框架高,大家习惯把它当成一个工具来用了,不愿意对它进行源码层次的解读

2)开发Dao接口(ResumeDao),接口的实现对象肯定是通过动态代理来完成的(增强),代理对象的产生过程追源码很难追,特别特别讲究技巧

源码剖析的主要的过程,就是代理对象产生的过程

我们发现resumeDao是一个代理对象,这个代理对象的类型是SimpleJapRepository

SpringDataJPA_5

1、 疑问:这个代理对象是怎么产生,过程怎样?

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

SpringDataJPA_6

SpringDataJPA_7

新的疑问又来了?

问题1: 为什么会给它指定为一个JpaRespositoryFactoryBean(getObject方法返回具体的对象)

问题2:指定这个FactoryBean是在什么时候发生的

⾸先解决问题2:

SpringDataJPA_8

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

SpringDataJPA_9

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

SpringDataJPA_10

我们发现,传入该方法的时候,BeanDefintion中的class就已经被指定为FactoryBean了,那么观察该方法的调用栈

SpringDataJPA_11

SpringDataJPA_12

SpringDataJPA_13

SpringDataJPA_14

在这里插入图片描述

在这里插入图片描述

SpringDataJPA_17

通过上述追踪我们发现,<jpa:repository basePackage>扫描到的接口,在进行BeanDefintion注册时候,class会被固定的指定为JpaRepositoryFacotryBean

⾄此,问题2 追踪完毕

那么接下来,我们再来追踪问题1 JpaRespositoryFactoryBean是一个什么样的类

它是一个FactoryBean,我们重点关注FactoryBean的getObject方法

SpringDataJPA_18

SpringDataJPA_19

SpringDataJPA_20

SpringDataJPA_21

SpringDataJPA_22

SpringDataJPA_23

SpringDataJPA_24

SpringDataJPA_25

SpringDataJPA_26

SpringDataJPA_27

由此可⻅,JdkDynamicAopProxy会生成一个代理对象类型为SimpleJpaRespository,而该对象的增强逻辑就在JdkDynamicAopProxy类的invoke方法中

⾄此,问题1追踪完毕。

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

SpringDataJPA_28

SpringDataJPA_29

原来SimpleJpaRepository类实现了JpaRepository接口和JpaSpecificationExecutor接口

SpringDataJPA_30

以上是关于Spring Data JPA 执行过程源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 执行过程源码分析

Spring Data JPA 与 MyBatis 对比分析

Spring Data 系列 Spring+JPA(spring-data-commons)

Spring Data JPA想要学得好,缓存机制掌握好

Spring Data JPA想要学得好,缓存机制掌握好

Spring Data JPA使用