专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Spring Data JPA内部原理解析

Spring Data JPA常用接口分析

在入门案例中,我们仅仅定义了CustomerDao的接口,并没有提供任何的方法,那么我们所调用的增删改查的方法来自哪里呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRepository和JpaSpecificationExecutor,所以我们可以使用这两个接口的所有方法。

进入JpaRepository,在类上按住ctrl+F2:

78_1.png

在JpaSpecificationExecutor中也是类似的情况。

但是我们注意到,JpaRepository和JpaSpecificationExecutor是接口,其只是一些方法声明,没有具体的实现方式,那么在 Spring Data JPA中它又是怎么实现的呢?

Spring Data JPA的实现过程

已根据id查询用户代码为例:

打断点,观察我们定义的customerdao的实现对象是谁:

78_2.png我们可以看到产生了一个动态代理对象JdkDynamicAopProxy,而该对象是Spring内部通过AOP帮助我们创建对象的,单机右键,查看源码:

78_3.png

进如到JdkDynamicAopProxy对象中:

78_4.png

我们发现JdkDynamicAopProxy对象实现了InvocationHandler接口,找到invoke方法,其中target对象就是生成的动态代理对象,打断点查看:

78_5.png

让我们查询一下target对象的源代码(其实是SimpleJpaRepository对象)

78_6.png

可以看到SimpleJpaRepository对象继承实现了JpaRepository和JpaSpecificationExecutor接口中的方法。

78_7.png

78_8.png

由于我们的测试案例是根据用户id查询用户,实际上调用了findOne()方法,那么究竟是不是调用了SimpleJpaRepository对象中的findOne()方法呢?我们打断点测试一下:

78_9.png

我们可以看到,页面跳转到SimpleJpaRepository对象中的findOne()方法中,且接收到参数为1,与测试案例相吻合。

顺带一提,上述findOne()方法返回了一个em.find(),其实em就是EntityManager对象,而他是JPA原生的实现方式,所以我们得到结论Spring Data JPA只是对标准JPA操作进行了进一步封装,简化了Dao层代码的开发。

Spring Data JPA完整调用过程分析

78_10.png

文章永久链接:https://tech.souyunku.com/36605

未经允许不得转载:搜云库技术团队 » Spring Data JPA内部原理解析

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们