调用MapperProxy对象|学习笔记

简介: 快速学习调用MapperProxy对象

开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术调用MapperProxy对象学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/80/detail/15950


调用MapperProxy对象

 

调用的时候我们拿到的是一个 Map proxy,无论调接口的哪一个方法,它都是调的这个 map proxy的方法,这个才是用动态的代理机制来完成的。

image.png

无论你调这个接口的任何一个方法,他会传三个参数。所以你无论调他的哪一个方法,它的差别就是这个方法是不同的,参数是不同的,然后来调这个,Mapproxy的 invoke的方法,首先进来的是他会调一个自己的私有的方法,这个私有的方法的目的是去一个已经存在的这个 method invoke,因为这一个接口的这个方法,也许以前被调过,所以他就不想去构建这个 invoke的过程,不要再重复做一遍。所以在这里头可以看到它有一个那个 method cache,不是我刚才看到构建构建这个map的 proxy的时候,是一个 method cache的,比如说 cache的就是这个 method invoker。

所以当他如果有调过的话,cache 存了 Invoker就不需要实例化了,如果没调过的话,就需要实例化一个Invoker。所以这个方法无论如何他都会返回一个这个叫做method invoke对象,对象里头其实有两个子类。一个是 default的 method invoker。另外一个是 plan invoker。一般来说都会使用这个 plan Method invoker,这个调开始返回的,他会调这个 invoker方法,同样的把 proxy传给他

method,然后参数另外传了一个Sesson,因为他要通过最后要调Sesson,所以传给他,我们知道这个session是构建这个map proxy的时候,就给它放进去的。

前面到构建MapperProxy的三个参数:接口、sesson、还有master page,调这个panda method invoker这个方法里头,它都会执行invoker里头的属性,放到map

的method,所以map的method就是在这个Method invoket里头的属性,这个属性的对象里头,它有一个方法叫做execute,参数是sesson args来执行这个过程。那他怎么执行的?

其实是在这个map method中间可以看到它有两个属性,另外一个是method signifiture, meth这个东西就是一个map method,其实对应的就是我们在X mail中

间定义的一个。标签,就是一个map method,那标签的不同其实体现在什么?

在上面那个command的不同,就是一共有四种command,分别是slight

command、insert command、delete command、update command。他操作的标签主要是有这四种,标签里头写的那个内容是存在那个command的,在标签的上面可以看到它有一个传参的一个ID,然后有个传参的定义,有一个返回值的定义,那个写在了下面 Signature的这个里面,所以一个标签里头的所有的内容就写在了这个 command and  method signature的内容里头。当说要运行这一个方法的时候。可以看到它只提供了一个 execute,写的就是去这个判断那个stu commander是什么内容,如果是 insert

Situation in SP 的方法,如果 Amanda是一个 update,它去掉 sesson的 delete方法,如果他是一个 delete,去掉 session的 delete的方法,就是写的这样的内容,所以说是一个 Switch case。

Switch case,SwitchSQL command是什么样的类型,去调什么样的方法,第二在调方法之前,根据那个 methods isignificant的定义去做一个这个适配,就是他传进去的参数该怎么处理,传回的值该怎么处理?就是调过去的时候,你传过去的这个参数 argus。怎样映射到那个方法上去,以及说他传过来的值怎么回到我们需要返回的这个对象的这个类型上,这是那个 method significant里头所做的内容。所以这一段代码,就是我们可以看到在这个 map method excute里头的SQL的代码,其实是很长的,所以这是一段非常不面向对象的代码他这么写的目的就是使得不管那个 command是什么样的内容,就是不管那个在插件中间他要执行的是insert和 update delete还是什么样的内容,通通对于我们的代码来说都是去执行execute,传这个参数过去,那至于说他是什么内容,看这个 map method 中间的command是什么内容,看他的这个 method signature 是什么内容,然后去执行对应的方法,看这个东西是什么内容,这一端的代码就平铺在这个 IP的这个代码。

这是非面向对象的做法,它的缺点是不好扩展,如果说出现了第五种命令的话,意味着这段代码是需要去做修改。那这段代码如果说要调用一个新的第五种命令,通常对应的一个  sesson的新的动作,那这个 sesson码也要去修改。所以说他不是一

个高内聚的设计,但它是一个低耦合的设计,它的低耦合的设计是什么?

就是当出现新的这个动作的时候,或者说我们不管做什么样动作的时候,你们可以看到这个类图,这个动态模型都是一样的,就是代码都是一样的,至少说到这为止的代码都是一样,她的变化被包含在这个 Mac method。这个是一个设计模式,这个叫做命令模式。命令模式的意思就是我们把不管什么样的动作,我们不管是哪一

种的这个动作,我们通通把它包装成为一个统一的命令。

把它做成一个无差别的 execute的这样的一个方式,那它的差异性包含在这个对象

的内部。

会使得说我们去执行这样的一个对象的时候,我们并不去区分是我们执行的是哪一种命令,这样的话就会使得出我们执行的命令,执行的命令这个部分跟具体的这个命令的内容是做成的低耦合的,但他不是一个高类聚的设计,但是它是个低耦合的设计,这是第四个设计模式命令的这样的一个设计模式。那在 Mabits中间,如果说你定义的是不同的命令,它就会定义的是不同的这个标签,他就会执行 sesson中间的不同的命令。

相关文章
|
5月前
|
编译器 数据安全/隐私保护 C++
【类与对象】封装&对象的初始化及清理
【类与对象】封装&对象的初始化及清理
|
算法 Java 编译器
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
|
程序员 Scala 开发者
函数(方法)的调用机制|学习笔记
快速学习函数(方法)的调用机制。
函数(方法)的调用机制|学习笔记
|
开发者 索引 Python
对象操作2|学习笔记
快速学习对象操作2
对象操作2|学习笔记
|
网络协议 测试技术 Go
方法的调用和传参机制 | 学习笔记
快速学习方法的调用和传参机制
方法的调用和传参机制 | 学习笔记
|
Java
CheerpJ调用的两种方式
CheerpJ调用的两种方式
240 0
|
开发者 索引 Python
对象操作1|学习笔记
快速学习对象操作1
|
Java 开发者
反射调用普通方法|学习笔记
快速学习反射调用普通方法
111 0
反射调用普通方法|学习笔记
|
存储 开发者 Python
对象介绍|学习笔记
快速学习 对象介绍
|
开发者
包装对象|学习笔记
快速学习 包装对象