💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**1. 常用接口继承关系** :-: ![](https://img.kancloud.cn/40/af/40af28b1f89f701381f5807ed960aa3b_600x547.png) 常用的两个接口是JpaRepository和JpaSpecificationExecutor。只要让我们的接口继承这两个接口,就可以调用这两个接口的一些方法与数据库做CURD操作。但是这些方法都只是声明并没有实现,那么在Spring Data JPA中这些方法是如何实现的? <br/> **2. JDK动态代理实现** 其实这些接口方法的实现是通过JDK动态代理来实现的。 下面简单演示一下其实现过程。 (1)通过 JdkDynamicAopProxy 动态代理生成接口 UserRepository 的一个代理对象SimpleJpaRepository。 ![](https://img.kancloud.cn/64/08/6408544cf258943d4523576b95a988e2_1467x480.png) (2)通过查看 SimpleJpaRepository 的源码可以看到有函数`findOne`。 ![](https://img.kancloud.cn/90/a9/90a972eeb636957d24856496c032cbae_1244x210.png) (3)`findOne`函数调用了`this.getQuery(..)`函数,定位到该函数可以发现有一个变量`this.em`。 ![](https://img.kancloud.cn/3f/a8/3fa8bce098b633b7faebfa69327b6f08_1243x235.png) (4)而这个`this.em`变量就是接口 EntityManager。 ![](https://img.kancloud.cn/c1/b6/c1b6e8c0c7342d24428df631b22c6cdb_1246x202.png) (5)这个 EntityManager 就是JPA原生的实现方式。 ![](https://img.kancloud.cn/fd/15/fd1567d8490ddbbf7497e238df09131c_1289x229.png) 所以我们得到结论Spring Data JPA只是对标准JPA操作进行了进一步封装,简化了Dao层代码的开发。 <br/> **3. Spring Data JPA的调用过程** :-: ![](https://img.kancloud.cn/c0/18/c018c07aad11044ccec081cbcb7fffde_230x458.png)