JPA(8)之SpringData JPA内部原理剖析

JPA(8)之SpringData JPA内部原理剖析

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

Spring Data JPA的常用接口分析

在客户的案例中,我们发现在自定义的 CustomerDao 中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的 Dao 接口,由于继承了 JpaRepositoryJpaSpecificationExecutor,所以我们可以使用这两个接口的所有方法。

image.png

在使用 Spring Data JPA 时,一般实现 JpaRepositoryJpaSpecificationExecutor 接口,这样就可以使用这些接口中定义的方法,但是这些方法都只是一些声明,没有具体的实现方式,那么在 Spring Data JPA 中它又是怎么实现的呢?

Spring Data JPA的实现过程

通过对客户案例,以 debug 断点调试的方式,来分析 Spring Data JPA 的原来来分析程序的执行过程,这里以 findone 方法测试。

代理子类

image.png

断点执行到方法上时,我们可以发现注入的 customerDao 对象,本质上是通过 JdkDynamicAopProxy 生成的一个代理对象。

代理对象中方法调用的分析

当程序执行的时候,会通过 JdkDynamicAopProxyinvoke 方法,生成 CustomerDao 的动态代理对象并赋值给 customerDao 对象。根据对 Spring Data JPA 介绍而知,要想进行 findOne 查询方法,最终还是会使用 JPA 规范的 API 完成操作,那么这些底层代码存在于何处呢?答案很简单,都隐藏在通过 JdkDynamicAopProxy 生成的动态代理对象当中,而这个动态代理对象就是 SimpleJpaRepository

image.png

查看 SimpleJpaRepository 的源码,定位到 findOne 方法,在此方法中,返回 em.find() 的返回结果:

image.png

那么 em 又是什么呢?

image.png

我们发现 em 就是 EntityManager 对象,而它是 JPA 原生的实现方式,所以我们得到结论 Spring Data JPA 只是对标准 JPA 操作进行了进一步封装,从而简化 Dao 层代码的开发。
可总结 Spring Data JPA 的调用过程如下图:

image.png

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/jpa8.html

Buy me a cup of coffee ☕.