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 的调用过程如下图:
评论区