暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Data JPA初入门及原理分析(下)

小二与小七 2020-03-12
385

    前几天小七简单的介绍了SpringData JPA,并做了一个简单的入门案例,今天我们就来聊聊它运行的原理。

  1. 代码分析

  下面是我们前几天写的DAO接口,它只是继承了JpaRepository和JpaSpecificationExcutor这两个接口,并没有任何实现,就能完成查询,保存等功能,为什么呢?

再看一下我们的测试代码,显然接口是不可能被实例化,那么这里Autowired注入了什么?

     我想,到这里我们肯定都想到了——动态代理,这里一定产生了一个动态代理对象,为我们实现了这些方法,下面我们通过DEBUG模式运行一下看看这个动态代理对象是怎么产生的。

  2.执行过程分析

     这里我们看到了,它为我们生成了一个SimpleJpaRepository的代理对象,那它是怎么生成的?

 在IDEA的debug调试窗口可以看到这个JdkDynamicAopProxy,我们看一下它的源码(选中它右键-->jump to type source):

可以看到它实现了InvocationHandler这个接口,那么可以证实了它确实是通过动态代理实现的,其实Spring AOP就是通过JdkDynamicAopProxy帮助我们使用动态代理的方式创建对象的,那么我们直接找到它实现的invoke方法如下,

在Object target = null;处打断点按F8继续往下走,然后你会看到

    此处的target的值已经变成了SimpleJpaRepository,那么这个代理对象到这里就已经产生了,我们看它的源码,可以阿卡难道它实现了JpaRepository和JpaSpecificationExcutor这两个接口,而我们在创建Dao接口的时候就继承了它们,所以SimpleJpaRepository也可以看成是我们的Dao的一个实现类,还有em这个变量需要关注一下,他是实体类的管理工具。

以上,就到这吧,下次分享一个小程序的实现。

文章转载自小二与小七,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论