🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
**1. 接口继承关系** :-: ![](https://img.kancloud.cn/d4/d9/d4d9884ce59115ecb2954d2e0641dc61_1001x910.png) 常用的两个接口是 JpaRepository 和 JpaSpecificationExecutor。 只要让我们的接口继承这两个接口,就可以调用这两个接口的 API 对数据库做 CURD 操作。 但是这些接口都只是声明并没有实现,那么在 Spring Data JPA 中这些接口是如何实现的? <br/> **2. JDK动态代理实现** 其实这些接口方法的实现是通过 JDK 动态代理来实现的。 下面简单张贴几张图描述一下其实现过程。 (1)通过 JdkDynamicAopProxy 动态代理生成接口 UserRepository 的一个代理对象SimpleJpaRepository。 ![](https://img.kancloud.cn/b0/9f/b09ff6f30be9e000e2fb5caa767d2e3a_1537x508.png) (2)通过查看 SimpleJpaRepository 的源码可以看到有函数`findOne`。 ![](https://img.kancloud.cn/69/16/69160681ec092088cca1de824c72bed4_1531x267.png) (3)`findOne`函数调用了`this.getQuery(..)`函数,定位到该函数可以发现有一个变量`this.em`。 ![](https://img.kancloud.cn/a5/30/a530c75156f44fa22bcfd90f564e4b62_1538x300.png) (4)而这个`this.em`变量就是接口 EntityManager。 ![](https://img.kancloud.cn/1e/14/1e149d0ccea6b53479bae8a9202ad73f_1535x261.png) (5)这个 EntityManager 就是JPA原生的实现方式。 ![](https://img.kancloud.cn/6c/fc/6cfc932dea32995c99d607e566bd783a_1534x278.png) <br/> 所以我们得到结论 Spring Data JPA 只是对标准 JPA 操作进行了进一步封装,简化了 Dao 层代码的开发。 <br/> **3. Spring Data JPA的调用过程** :-: ![](https://img.kancloud.cn/6a/3c/6a3c564da27d19c3f9bec197da7ac6f5_230x458.webp)