思考

在客户的案例中,我们发现在自定义的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到底是谁?

最新文章

  1. linux系统添加硬盘方法
  2. .net mvc web api 返回 json 内容,过滤值为null的属性
  3. Swift3.0语言教程比较、判断字符串
  4. sqlserver数据库维护脚本大全,值得收藏
  5. spoj 42
  6. KNN及其改进算法的python实现
  7. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
  8. 创建、设置和安装Windows服务
  9. Java中的集合概述
  10. Coursera课程 Programming Languages, Part B 总结
  11. 浅谈MySQL集群高可用架构
  12. 一些Gym三星单刷的比赛总结
  13. 使用清华源替代Ubuntu源
  14. vijos 1605 双栈排序 - 贪心 - 二分图
  15. Scala学习(五)练习
  16. Java中Asm包有什么用?
  17. C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过
  18. DHCP分配固定IP
  19. 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
  20. spotlight on mysql--安装以及简介

热门文章

  1. Yii框架的学习指南(策码秀才篇)1-3 我是这么学习的yii framework (不间断更新中)
  2. 103)PHP,递归读取目录内容
  3. 牛客-Corn Fields
  4. Qt static关键字全局变量
  5. SHELL用法七(Sed语句)
  6. C语言Windows程序设计—— 使用计时器
  7. Rancher安装多节点高可用(HA)
  8. 吴裕雄--天生自然 R语言开发学习:主成分分析和因子分析(续一)
  9. 对RLC重排序窗口大小的一点讨论
  10. 内核融合:GPU深度学习的“加速神器”