MyBatis(七) —— MyBatis的动态代理

动态代理的相关知识参考我前面的一篇文章→Mybatis(二)—— 动态代理,这篇文章主要看看MyBatis的底层源码,看它是如何实现动态代理的:

在前面的MyBatis的使用中,我们可以看到,每次都会用到这句代码:

在这里插入图片描述
那我们就从getMapper进去,看看MyBatis底层是如何生成代理对象的:
在这里插入图片描述
显然,它运用到了configuration对象(configuration是一个单例对象,它作为一个统领,所有的配置文件都会缓存在这里,然后通过它,一步一步的构建所需的内容,创建最终的对象(建造者模式))的getMapper方法,然后我们继续跟踪这个方法:
在这里插入图片描述
再点进去,我们会看到:
在这里插入图片描述
到这里,首先它会判断是否注册一个Mapper,如果没有则抛出异常,如果有,就会启用mapperProxyFactory工厂来生成一个代理实例,为此,我们从框起来的代码进去:
在这里插入图片描述
在这里插入图片描述
注意看下面有箭头的地方的代码,Mapper是通过动态代理来实现的,这里可以看到动态代理对接口的绑定,它的作用就是生成动态代理对象,而代理的方法则被放到了MapperProxy中,为此我们再进一层:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果Mapper是一个JDK动态代理对象,那么它就会运行到invoke方法里面;invoke首先判断是否是一个类,这里Mapper是一个接口不是类,所以判断失败,然后会生成MapperMethod对象,它是通过cachedMapperMethod方法对其初始化的,最后执行execute方法,把SqlSession和当前运行的参数传递进去,execute方法的源码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法比较多,只看框中的即可,我们可以看到,最终都是通过SqlSession对象去运行对象的SQL而已,其他的增删改查也是类似这样处理的,至此,相信大家已经知道为什么MyBatis接口便能运行了,因为Mapper的XML的命名空间对应的是这个类的全限定名,二方法就是那条SQL的id,这样MyBatis就可以根据全路径名和方法名,将其和代理对象绑定起来,通过动态代理技术,让这个接口运行起来,而后采用命令模式,最后使用SqlSession接口的方法便能够执行对应的SQL,只是有了这层封装,就可以采用接口编程,这样编程更为简单明了;

所以再MyBatis的动态代理里面,公共接口就是我们自己写的那个接口,代理类就是SqlSession,委托者也就是具体实现类是Execute(在configuration对象中创建的,点进去一点就会看到执行者是Execute的实现类);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值