【自用】mybatis openSession源码流程

救命啊,我实在啃不动了,太他吗痛苦了

configuration对象概念

在这里插入图片描述

openSession

在这里插入图片描述

点这个,可以看到这个接口的实现方法

在这里插入图片描述
在这里插入图片描述

调构造,返回了什么寄吧东西

在这里插入图片描述

好像是一个实现类对象

在这里插入图片描述

executor 是一个事务对象

在这里插入图片描述
在这里插入图片描述

点这个

在这里插入图片描述

看看里面的属性在这里插入图片描述

断点太多了,怎么办,取消断点

在这里插入图片描述

这么取消断点

在这里插入图片描述

getMapper

在这里插入图片描述

进入方法

又掉了configuration里面的getMapper方法

在这里插入图片描述

我不行了,我不记录了,就这样吧

又调了mapper注册器里面的getMapper方法

在这里插入图片描述

看看这个mapperRegistry再干什么

在这里插入图片描述

他是个map,在configuration下面,管理映射文件

在这里插入图片描述

终于不调了,主要看这个方法

在这里插入图片描述

把sqlsession 传进来,session里面怎么有这么多东西

在这里插入图片描述

是在那里存进去的来着,我去找找

public SqlSession openSession() {
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }

getMapper 里面最重要的一行代码

在这里插入图片描述

(我觉得叫做映射文件要好一些)还真他吗的是接口类对象

在这里插入图片描述

在这里插入图片描述

那么这行代码是在干什么

看看MapperProxy 这个类在干什么

在这里插入图片描述

继承了一个接口,老师说他也不知道是干什么的

接口里面就一个方法

在这里插入图片描述

重写了invoke方法

在这里插入图片描述

我们mapper最终是由上面那行代码返回去的,这两行代码

在这里插入图片描述

这个不认识的单词是代理的意思

在这里插入图片描述

只要搞懂这两行代码,就能搞懂mapper的底层了

 public T newInstance(SqlSession sqlSession) {
        MapperProxy<T> mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);
        return this.newInstance(mapperProxy);
    }


 protected T newInstance(MapperProxy<T> mapperProxy) {
        return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
    }

我以为this.mapperInterface应该存的是个字符串,但是现在来看应该是个对象

在这里插入图片描述

mapper对象就是这行代码返回来的

在这里插入图片描述

我先在看不懂大概知道这两行代码传了什么值进去,但是我不懂,这两行代码里面的运行逻辑,老师要先带我学习,代理proxy

这居然是一种设计模式,复杂的设计模式proxy

老师说这个也算简单的

静态代理模式

两个同一类型的对象,可能不是同一个类的对象在这里插入图片描述

学到了两个,第一原生的jdbcl连接是怎么写的,老师写的这种居然能运行??

在这里插入图片描述

第二,德鲁伊连接池里面真的,什么都是用conn来运行的啊,就colse 是放回自己的连接池里面(哇,虽然我能想到,但是真的看到的时候,还是震惊)

他在调数据库操作方法的时候,都还在调原生的JDBCForConnection 的操作

就close没有在调

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

就是个这么个结构

在这里插入图片描述

我他吗吐了,我居然静态代理那节课还没有听,救命啊!!!

静态代理类例子

接口

在这里插入图片描述

被代理实现类

在这里插入图片描述

在这里插入图片描述

代理实现类

持有了属于是

在这里插入图片描述

代理与被代理实现代码

在这里插入图片描述

方法运行结果

在这里插入图片描述

代理设计模式,就是这几行代码

持有被代理对象

在这里插入图片描述

无法改源码的时候:使用代理模式

特点:同类型,持有被代理

为什么要用这种方式,不能改源码,或者源码已经封到jar包里面了

实践,对类创建代理对象

1、创建一个新类

2、实现connect接口

3、把被代理对象传到新类里面

4、实现所有的方法

5、一个一个调 this.被代理对象.原来的方法

6、写那个和原来实现不一样的方法,或者新增方法

自己写连接池?(这是个练习

搞一个集合

初始往里面放10个连接

连接池里面放的 是代理的,因为:

放代理的–close的时候,执行代理的close,直接放回连接池了

什么时候创建代理对象

1、初始化连接池的时候,池子里面放的就是代理对象

2、也可以池子里面放的是原生的被代理对象

get的时候再去包装成代理对象

动态代理:54分钟! 快鲨了我吧,快!求你了,我哭了,一下午啥都没干,除了睡觉就是在看鬼畜视频,还出去骑了二个小时的自行车。

我真是个沙比,现在是两点。我今天就算死在这个厨房,我也要他妈的把mabtis这三节底层课看完,外加半部spring课程

代理模式

概念:当一个已经存在对象中,的某个方法,不满足需求,需要改变。使用代理模式来扩展

方法就是 代理和被代理同类型 代理持有被代理

被代理对象就是已经存在的原对象

代理对象就是我们新创建的对象

例子:代理对象与被代理对象 同类型,就是JDBC和Druid的Conn的关系,

特点:代理对象与被代理对象同类型,代理持有被代理

代理对象与被代理对象同类型

就是一个接口new两个实现类

代理持有被代理

因为要调用被代理里面的原生方法

动态代理模式

这个可能是静态代理

在这里插入图片描述

动态代理的特点

在这里插入图片描述

1、不用开发人员手工创建类

2、通过jdk工具类proxy类在程序运行期间,动态在内存中生成一个$proxy0 $proxy1 …的类,并实例化代理类

手工创建的问题

1、麻烦我就要重写那一个方法,但是继承接口类之后,我要一个一个的去调this.conn. 方法

在这里插入图片描述

虽然写法简单,但是会带来新的问题

开始写了

在这里插入图片描述

第一个参数是类加载器对象

第二个是被代理的接口 因为可以继承多个类,所以是代理接口数组

java数组居然能放所有数据类型,卧槽,我以为只能放基本数据类型,我之前这个错误观念是谁带来的??

invovation 回调

在这里插入图片描述

handler 应该就是处理的意思

在这里插入图片描述

新概念诶,回调,类似于前端的异步请求

回调,不会立即执行,要有了响应参数才会执行

不会立即执行,而是回头再执行

成功回调,失败回调

在这里插入图片描述

回调类在jdk里面没有实现类,需要我们自己去实现这个接口

在这里插入图片描述

咱们也不知道这个回调函数什么时候执行

在这里插入图片描述

返回一个实例化了的代理对象

在这里插入图片描述

代理对象的类型,和被代理对象的类型一样的,所以

在这里插入图片描述

这个动态代理,绝对要比自己写的静态代理,代码少得多

用来测试什么时候执行回调

在这里插入图片描述

我调用eat,其实是在调用invoke

原方法

在这里插入图片描述

回调函数的执行结果

在这里插入图片描述

调用run方法,还是这两个数

在这里插入图片描述

sleep也是

在这里插入图片描述

说明 这个 代理实现类里面的方法 都是去掉那个匿名函数 invoke这个方法了

结论

在这里插入图片描述

上面return 返回值就是这个

在这里插入图片描述

都是如此

在这里插入图片描述

第二个问题,它为什么能调到实现类里面的invoke方法呢

在这里插入图片描述

说明那个代理类里面有 handler的引用 成员变量

在这里插入图片描述

这是我们分析出来的代码结构

在这里插入图片描述

invocationHandler 里面 的invoke 方法的参数

在这里插入图片描述

invoke 引用的意思

老师用test生成的.class找不到,换到src源代码下面,就在项目里面生成了文件夹了

jd-gui反编译工具

实现了isource接口

在这里插入图片描述

唉呀,我以为invocationHandler 是啥高端东西呢,这不就是普通的Invoke 吗,传进去实例对象,实例对象的方法,实例对象方法需要的参数,大号的invoke罢了,尚硅谷的那节课也太他妈有用了吧,我现在还在受益

在这里插入图片描述
添加链接描述

看看这几个方法到底是什么:

在这里插入图片描述

自己看着拼接一下,我就不用ps了

就是某类里面的某个方法

比如上面图中的m3对应的就是eat方法

在这里插入图片描述
在这里插入图片描述

反射就是反向写代码(笑死)

method是什么东西

得到类对象

在这里插入图片描述

用类对象,调用方法

eat是方法名,后面的Class数组是形参的class对象

我怎么看我之前invoke 是传入实参的啊

在这里插入图片描述

传入实参,应该是要运行那个方法,生成method对象,应该真是的 填入 参数的class类对象

他应该和我直接getDeclaredMethod()这个不一样,是需要手工生成method类的

在这里插入图片描述

实例化对象

在这里插入图片描述

invoke(调用,引用)

在这里插入图片描述

老师写的反射运行结果

在这里插入图片描述
在这里插入图片描述

妈妈,我能看懂了

在这里插入图片描述

在这里插入图片描述

我能看懂了,这个反编译proxy里面的东西

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值