救命啊,我实在啃不动了,太他吗痛苦了
configuration对象概念
openSession
点这个,可以看到这个接口的实现方法
调构造,返回了什么寄吧东西
好像是一个实现类对象
executor 是一个事务对象
点这个
看看里面的属性![在这里插入图片描述](https://img-blog.csdnimg.cn/87d13a6c3288467ea7e3ef51470fc8f0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDI3NjU0OTM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
断点太多了,怎么办,取消断点
这么取消断点
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
老师说这个也算简单的
静态代理模式
两个同一类型的对象,可能不是同一个类的对象![在这里插入图片描述](https://img-blog.csdnimg.cn/5bfcd93ed945414fbcab4deb1feda695.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfNDI3NjU0OTM=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
学到了两个,第一原生的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(调用,引用)
老师写的反射运行结果