springDataJpa的运行过程和原理剖析

1 执行过程分析

1.分析如图所示:

Spring Data LDAP干啥的_JPA


1.通过JdkDynamicAopProxy的invoke方法创建了一个动态代理对象

2.SimpleJpaRepository当中封装了JPA的操作(借助JPA的api完成数据库的CRUD)

3.通过hibernate完成数据库操作(封装了jdbc)

以测试findOne()方法为例,在findOne()方法之前打断点,并使用debug运行如图所示:

Spring Data LDAP干啥的_JPA_02


如图所示,说明customerDao是一个动态代理类对象。

Spring Data LDAP干啥的_动态代理_03


2 源码分析步骤如下:

a.如图所示,是Spring AOP的一种实现方式。

Spring Data LDAP干啥的_动态代理_04


Spring AOP内部就是通过动态代理来帮助创建代理对象的。所以创建的对象就是借助JdkDynamicAopProxy进行创建的。

通过Jump To Type Source来查看源码如图所示:

Spring Data LDAP干啥的_执行过程_05


进入如图所示界面,JdkDynamicAopProxy实现了InvocationHandler。

Spring Data LDAP干啥的_执行过程_06


InvocationHandler就是动态代理的一个参数。找到如图所示invoke()方法。

Spring Data LDAP干啥的_执行过程_07


当我们去执行invoke()方法的时候,就会帮助我们去创建客户的Dao对象接口的实现类。Object target = null;target就是生产的代理对象。

如图所示,对target进行赋值。

Spring Data LDAP干啥的_Spring Data LDAP干啥的_08


target就是 SimpleJpaRepository对象,在debug控制台使用Jump To Type Source来查看源码如图所示:

Spring Data LDAP干啥的_动态代理_09


进入SimpleJpaRepository如图所示:

Spring Data LDAP干啥的_Spring Data LDAP干啥的_10


SimpleJpaRepository实现了JpaRepository,JpaSpecificationExecutor的接口。SimpleJpaRepository也就是CustomerDao实现类。

在自定义的CustomerDao中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRepository和JpaSpecificationExecutor,所以我们可以使用这两个接口的所有方法。

找到findOne()方法源码如图所示:

Spring Data LDAP干啥的_动态代理_11


em就是EntityManager是JPA的实体类管理器。通过find()方法的执行过程。

动态分析如图所示:

Spring Data LDAP干啥的_JPA_12