Mybatis 代理模式

1. 代理方式获取Mapper -> getMapper()

在这里插入图片描述
思考一个问题,通常的Mapper接口我们都没有实现的方法却可以使用,是为什么呢?答案很简单动态代理。
开始之前介绍一下MyBatis初始化时对接口的处理:MapperRegistry是Configuration中的一个属性,它内部维护一个HashMap用于存放mapper接口的工厂类,每个接口对应一个工厂类。mappers中可以
配置接口的包路径,或者某个具体的接口类。
在这里插入图片描述
当解析mappers标签时,它会判断解析到的是mapper配置文件时,会再将对应配置文件中的增删改查标签 封装成MappedStatement对象,存入mappedStatements中。(上文介绍了)当判断解析到接口时,会建此接口对应的MapperProxyFactory对象,存入HashMap中,key =接口的字节码对象,value =此接口对应的MapperProxyFactory对象。
下面去看一下getMapper方法的实现过程。
首先是DefaultSqlSession中的getMapper
在这里插入图片描述
可以看到调用的是Configuration中的getMapper
在这里插入图片描述
这里我们看到了mapperRegistry对象,这个也就是在初始化过程中将
Mapper的代理对象存储的位置。接着我们进到mapperRegistry.getMapper方法中:
在这里插入图片描述
mapperRegistry.newInstance方法
在这里插入图片描述
到这里我们也就能理解了,在初始化过程中,将配置文件中配置的mapper对应的接口创建一个代理对象存到Configuration对象的mapperRegistry对象中,将mapper的class全路径限定名称作为Key,将代理对象作为value存到一个mapper中。调用getMapper方法是直接根据Key就能获取代理对象了。

2. invoke方法执行

在动态代理返回了示例后,我们就可以直接调用mapper类中的方法了,但代理对象调用方法,执行是在MapperProxy中的invoke方法中。
在这里插入图片描述
进入execute方法:
在这里插入图片描述
可以看到这里定义了很多操作的类型insert/select/update/delete,就拿select方法来说:
在这里插入图片描述
在这里插入图片描述
进入sqlSession.select方法,
在这里插入图片描述
发现最终还是有executor来执行query方法来执行操作,这个跟传统的方式就没有什么区别了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值