SpringDataJPA 源码解析

SpringDataJPA是什么

SpringDataJPA是Spring基于ORM框架、JAP规范的基础上封装的一套JPA应用框架,可以使开发者用极简的代码对数据进行查询和操作,操作简单且易于扩展,使用SpringDataJPA框架可以极大提高开发效率。

JPA规范

首先我们在学习SpringDataJPA前,先了解一下什么叫JPA规范。JPA(Java Persistent API)是Sun公司官方提出来的持久化规范,是一种标准的ORM规范,使得应用程序以一种统一的方式访问持久层。
JPA包括以下三个方面的内容:

  • API的标准,在java.persistentence的包下面,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,是的开发者不必要写繁琐的JDBC和SQL。
  • 面向对象的查询语言:Java PersistenceQueryLanguage(JPQL),这是持久化操作中比较重要的,通过面向对象而非面向数据库查询语言。
  • ORM(Object/Relatioal Metadata)元数据的映射,JPA支持XML和JDK5.0注解的方式,描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

在这里插入图片描述

在DAO层中,我们定义了一个RoleDAO接口,用来查询数据库,在上述代码中我们看出,RoleDAO接口继承了JPARepository。

public interface RoleDAO extends JpaRepository<Role,Integer>{
}

在这里插入图片描述
在这里插入图片描述
上图中我们可以看出RoleDAO接口继承了JpaRepository。在Service层的test()方法中,我们调用的findOne()方法,其实现类还是JpaRepository类中的方法。
这些方法是如何调用的呢,我们发现roleDAO对象本质上是使用JdkDynamicAopProxy生成的代理对象。那我们进入JdkDynamicAopProxy
在这里插入图片描述
JdkDynamicAopProxy实现了AopProxy、InvocatioHandler这两个接口,在JDK的动态代理机制中有一个重要的类和接口,InvocatioHandler接口,以及Proxy类。每个动态代理类的调用处理程序必须实现InvocatioHandler接口,当我们通过动态代理对象调用一个方法时,方法的调用就会被转发到实现InvocatioHandler接口的invoke方法来调用。
因此我们找到invoke方法:
在这里插入图片描述
其中的target就是生成的动态代理对象。
我们可以知道roleDAO 调用的findOne方法,实际上就是SimpleJpaRepository类中的方法,下面我们就进入SimpleJpaRepository类查看究竟。
在这里插入图片描述
我们终于在SimpleJpaRepository中找到了findOne方法,可以看出传入的参数ID,确实是我们设置的1。进一步的debug,我们发现返回的是em.find方法,下面我们进一步查看一下,em(EntityManager)是什么:

<T> T find(Class<T> var1, Object var2, Map<String, Object> var3);

我么发现其实EntityManager的find方法,最终调用的是Hibernate中SessionImpl类的find方法:
在这里插入图片描述
所以我们可以得出结论,SpringDataJPA的整个调用过程是:

  1. 通过JdkDynamicAopProxy的invoke方法创建SimpleJpaRepository的动态代理对象
  2. SimpleJpaRepository实现JpaRepository对基本的JPA的CRUD操作进行封装
  3. 调用EntityManager类中相应的方法实现findOne的查询(最终底层还是调用Hibernate中的方法)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值