17 Spring Data JPA的常用接口分析
Posted zhaochengf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17 Spring Data JPA的常用接口分析相关的知识,希望对你有一定的参考价值。
思考
在客户的案例中,我们发现在自定义的CustomerDao中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRepository和JpaSpecificationExecutor,所以我们可以使用这两个接口的所有方法。
在使用Spring Data JPA时,一般实现JpaRepository和JpaSpecificationExecutor接口,这样就可以使用这些接口中定义的方法,但是这些方法都只是一些声明,没有具体的实现方式,那么在 Spring Data JPA中它又是怎么实现的呢?
过程分析
当程序执行的时候,会通过JdkDynamicAopProxy的invoke方法,对customerDao对象生成动态代理对象。根据对Spring Data JPA介绍而知,要想进行findOne查询方法,最终还是会出现JPA规范的API完成操作,那么这些底层代码存在于何处呢?答案很简单,都隐藏在通过JdkDynamicAopProxy生成的动态代理对象当中,而这个动态代理对象就是SimpleJpaRepository
1.我们只写了接口,但是没有写实现类,这个实现类就是Spring在运行的时候,注入的代理对象。 2.Spring怎么知道生成的那个dao的实现类?因为在配置文件中指定了dao接口所在的包
<jpa:repositories base-package="cn.oracle.dao"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
3.生成的是什么对象?代理对象:通过jdk生成的动态代理对象Proxy.newProxyInstance(类加载器,实现的接口列表,InvocationHandler)JdkDynamicAopProxy: 这个是个对象,实现了InvocationHandler接口,所以这个类有invoke方法
4.在JdkDynamicAopProxy的invoke方法中有个target对象,这个对象就是真正干活的对象
5.真正干活的对象:SimpleJpaRepository
6.SimpleJpaRepository实现了我们dao接口继承的那两个接口,所以这个类中肯定有接口的所有方法
7.我们看到findOne方法中调用了em.find方法,这个em到底是谁?
以上是关于17 Spring Data JPA的常用接口分析的主要内容,如果未能解决你的问题,请参考以下文章