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

在使用 Spring Data JPA 时,一般实现 JpaRepository 和 JpaSpecificationExecutor 接口,这样就可以使用这些接口中定义的方法,但是这些方法都只是一些声明,没有具体的实现方式,那么在 Spring Data JPA 中它又是怎么实现的呢?
Spring Data JPA的实现过程
通过对客户案例,以 debug 断点调试的方式,来分析 Spring Data JPA 的原来来分析程序的执行过程,这里以 findone 方法测试。
代理子类

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

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

那么 em 又是什么呢?

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

评论区