Mybatis原理解析(三)--getMapper动态获取接口实现类
在上一篇中,我们讲述了Mybatis中是如何创建出SqlSession的,知道了在创建SqlSession的过程中Mybatis的底层其实是在帮我们创建了Executor执行器,并且存放在了创建的DefaultSqlSession中,想知道创建DefaultSqlSession过程的朋友可以到
Mybatis原理解析(二)SqlSession的创建过程
回到这一篇的主题,在我们获取到了带有Executor的DefaultSqlSession之后,我们就要通过这个DefaultSqlSession去getMapper去获取到我们对应的接口实现类了。通常都是这样调用的
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
那么此时我们debug进去,看看里面底层是到底发生了什么
进去之后尼里面是调用了DefaultSqlSession的Configuration对象的getMapper方法,把类对象type以及自身作为参数传了进去,继续深入。
在Configuration的getMapper方法中,里面调用的是MapperRegistry的getMapper方法,这个MapperRegistry对象好眼熟,在哪里见过尼?其实这个对象在我们第一篇讲述创建SqlSessionFactory的过程中,底层初始化Configuration对象时出现过了,所以说现在我们可以知道这个对象里面有一个knownMappers的Map属性对象,这个map的存的是以我们的接口类对象为key,接口类对象相对应的MapperProxyFactory为value的。现在继续深入。
可以看到knownMappers根据我们传进来的接口Class对象去获取到相应的MapperProxyFactory对象。然后我们继续执行到mapperProxyFactory.newInstance(sqlSession)这个方法,很明显这个方法最终返回给了上层一个泛型对象,所以这个方法就是重点了。继续深入。
里面new了一个MapperProxy对象,然后又作为参数传入了newInstance方法中,那么这个MapperProxy是什么东西?我们进去看一看。
可以发现其实这里用到了jdk的动态代理模式。看它的invoke方法。
然后此时我们先回到mapperProxyFactory的newInstance方法。
最后就把得到的动态代理的对象返回到上层了。
这里再多说一句,其实MapperProxy这个类只是一个为了创建我们的动态代理类的一个跳板而已,我们要的就是借助它去创建出我们的代理类,而这个代理类不负责对MapperProxy类的方法做任何的增强。因为通常我们在使用动态代理时是为了给某个代理的目标类的某些方法进行前后逻辑的增强,而这里其实不然,用到的其实只是得到代理类而已,所以我们并不关心invoke方法上面的逻辑,而是关心的是invoke方法最下面的逻辑,我们之后的增删改查操作全部都是作用于下面的逻辑之中了。
Mybatis原理解析(三)--getMapper动态获取接口实现类相关推荐
- MyBatis原理解析
参考自: MyBatis原理分析(通俗易懂)_Coder Wang-CSDN博客_mybatis原理 从源码一层一层进行分析,写得清晰易懂.我再这里就不赘述了,就写一下自己的大白话总结吧. Mybat ...
- java解析sql语句简书,Mybatis原理解析(一)--java.sql数据库操作的基本实现方式
在研究Mybatis原理之前,先看一下java中是如何实现一次对数据库的访问的: public void testSql() { Connection connection = null; State ...
- MyBatis的运行的核心原理解析(三)
2019独角兽企业重金招聘Python工程师标准>>> #插件 四大对象在运行得时候,在Configuration对象得创建方法里MyBatis使用了责任链得方式去封装,也就是说我们 ...
- Mybatis的第三章动态sql总结
我们来讲一下为什么要使用Mybatis的动态sql ? *因为动态sql之所以是Mybatis 的强大特性是因为我们在使用JDBC操作数据库的时候如果查询特别的多,将条件串联成sql字符串是一件很痛苦 ...
- MyBatis学习 之 三、动态SQL语句
2019独角兽企业重金招聘Python工程师标准>>> 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的, ...
- __getattr__动态获取接口
# -*- coding:utf-8 -*- #在看廖雪峰的python3.5教学时,看到面向对象高级编程_定义类 https://www.liaoxuefeng.com/wiki/001431608 ...
- vue动态获取接口域名
域名一般是打包到项目里面的,打包后不能动态配置,只能通过不同的指令来动态切换域名. 后台说增加一个配置文件,动态更改域名.查了查网上,现记录下步骤. 1.安装插件 npm install --save ...
- iOS下载大型文件原理解析三
在下载大型文件过程中是可以取消下载的 - (IBAction)download:(UIButton *)sender { // 状态取反 sender.selected = !sender.isSel ...
- springboot中动态获取bean工具类
在springmvc或者springboot的项目中,经常遇到需要获取其他的bean的类,从而使用该bean内部的一些方法,以供业务调用,我们知道,在spring项目中,某个被spring管理的类要调 ...
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
Java-Mybatis-02 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1NE411Q7Nx 学习资料:mybatis 参考文档 – ht ...
最新文章
- 2017.1.9版给信息源新增:max_len、max_db字段
- 2020浙江9月计算机等级考试,浙江2020年9月计算机等级报考具体流程
- Win10安装后必做的优化,解决磁盘100%占用
- vue router 参数_Vue.js项目开发技术解析
- 记录工作中用到的日期转换方法
- Matter-JS Composites 混合材料 · 下
- A8. 无人机编队飞行定位分析与讨论-大结局
- java自己写一个消息队列_Java语言快速实现简单MQ消息队列服务
- **alon_MM DMA Interface for PCIe使用详解
- 从技术转管理的困惑(转)
- bootstrap编写响应式页面
- 《敏捷教练-如何打造优秀的敏捷团队》读书笔记
- Windows Metro Style颜色色值表
- 程序员找如何才能找到传说中的女朋友?
- 802.11ac知识整合
- 用python实现银行金额大小写转换
- 三相异步电动机的定子磁动势
- 聊聊职场 - 个人发展
- 内网接入外网的几种方式
- Python简单实现PageRank计算
热门文章
- MLOps- 吴恩达Andrew Ng Selecting and Training a Model Week2 论文等资料汇总
- 算法:判断二叉树是否包含链表Linked List in Binary Tree
- Linux tcp数据分节接收,TCP的建立和终止 图解
- linux mysql 密码策略_Linux Ubuntu 14 MySQL 密码策略(复杂度)和审计插件
- 找零钱问题系列之记忆搜索
- python学习——和python的第一次亲密接触
- 编译原理完整学习笔记(三):词法分析
- POJ 1328 —— 贪心专题【区间贪心问题】
- Redis在Window的启动方式(包括安装包也送)
- java类加载器用途_对于java类加载器的认识(2)