17 Spring Data JPA的常用接口分析
2024-09-03 16:07:37
思考
在客户的案例中,我们发现在自定义的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到底是谁?
最新文章
- linux系统添加硬盘方法
- .net mvc web api 返回 json 内容,过滤值为null的属性
- Swift3.0语言教程比较、判断字符串
- sqlserver数据库维护脚本大全,值得收藏
- spoj 42
- KNN及其改进算法的python实现
- MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
- 创建、设置和安装Windows服务
- Java中的集合概述
- Coursera课程 Programming Languages, Part B 总结
- 浅谈MySQL集群高可用架构
- 一些Gym三星单刷的比赛总结
- 使用清华源替代Ubuntu源
- vijos 1605 双栈排序 - 贪心 - 二分图
- Scala学习(五)练习
- Java中Asm包有什么用?
- C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过
- DHCP分配固定IP
- 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)
- spotlight on mysql--安装以及简介