00:00
好,那接下来呢,我们再来说一下自定义对象参数的整个封装过程以及原理。首先来看我们的这个场景,页面呢,有可能给我们提交一大堆的这个数据,比如我们的姓名、年龄、生日,还有他喜欢的宠物等等各种信息,那么希望呢,把这些数据能直接STEMMVC给我们封装成我们指定类型的这个对象,比如person类型,正好呢,Person类型里面的属性跟我们页面提交的这些input框的name是一模一样的,而且呢也支持几点属性的写法,比如我们这个宠物的名字,那就是我们pet.name和点H,那我们希望呢,页面提交的这个数据能直接被封装成person对象,能不能实现这个事情,我们可以来测试一下,首先呢,在我们的这一块,我们编写了一个index页面,在这个页面呢,我提前写好了一个叫save user的这个表单,表单的POS提交一堆数据,这些数据里边呢,所有的这些属性都是对应好我写好的这个person里边的这个属性,而且呢也有几点属性的封装。
01:01
好啊,比如我们这个宠物的名字,宠物的年龄,宠物的类呢?声明在这,那么就来写一个方法,看能不能直接封装好来,Public string,我们就叫user。Save user,他来处理我们的save user请求,Post save user请求,然后呢,因为这个请求会提交很多的数据,那这些数据呢,都是person里边的东西,所以我希望直接封装为person,那我就直接写,那能不能直接封装为person,为了验证呢,我就给它直接返回person,返回person我们就来看浏览器打印的这个person接对象对不对?好,我现在来启动测试一下。那如果一切正常。那么再来探究一下,它是怎么封装到这个person里边的,好,来测试一下,我们来到我们的这个首页来刷新,首页呢,下边由我们这个测试封装我们的这个对象,我们这里边的数据呢,都有默认值,我直接来点击保存,哎,我发现呢,发了save u的请求,并且呢,我们这个数据都封装好,已Jason写出来了username张三H18没问题,所以呢,我们所有的东西都能给我们一一封装好,那为什么它能帮我们将页面里边的每一个数据跟我们person对象里边的每一个属性来进行绑定呢?这就是我们说的数据绑定每页面提交的请求数据,提交的请求数据你无论是用guest get我们这个提交的,还是我们这个post提交的,我们都可以和咱们这个对象进行绑定,对象属性进行绑定,他们整个绑定原理是什么?我可以把这个停一下,然后呢,我们以debug方式运行,那么de。
02:49
方式运行呢,我们之前已经给里边呢,在我们前面调试打了好多的这个断点了,那么就直接一步一步放行,我们再来回顾一下整个参数确定的过程。好,我现在debug断点打到这儿,我们来重新来提交save user方法走。
03:05
来到我们的这个断点,首先来到我们dispa的dopach方法没问题,然后呢,接下来如果我要放行,来到我们的这个handler adapt,我们适配器真正执行目标方法,这然后呢,我们再来放行,就来到它执行目标方法的里边,好,我们不放行了,我们自己回顾一下,我先step into,找到我们的这个handleler,相当于真正的这个处理器,再来step into,用我们这个adapter来执行我们处理器的目标方法,再进来,进来以后呢,我们再来往下放行,放行呢,这一块都是来加锁,如果同一个session是不是要锁住的这个session锁,然后呢,注意在这呢,我们EVO handler method的真正来执行我们的处理器方法,Step into进来,然后呢,它给我们构造一堆请求,这一块呢,都是各种初始化过程,然后呢在这把所有的参数解析器先保存到里边去,然后呢再把所有的返回值解析器再保存到里边去,因为我们后续的处理要用到它们,然后呢在这一块提前给我们创建了一个叫。
04:05
Model and view container,那我们以前正好来说之前原理的时候说过,Model and view container就是在我们请求处理的整个过程中,给我们包含了我们请求里边要用的所有视图数据,还有我们所有的模型数据,如我们要返回的页面和我们要页面放的数据,我们在这儿呢都有,然后呢,这个model and view u controler,就是提提前在这儿整的啊,Container啊,不是controller,然后呢,我们继续往下翻,这块呢,都提前,相当于给我们后续处理注册上好多的这个东西,包括来放一些这个线程池都有的啊,我们先不用管这些,我们来到我们这影VO e method,我们可执行的方法,真正来执行我们的目标方法,Step into,真正执行呢,我们第一步就是来VO for request执行,我们这个请求执行完了以后呢,就会有方法的返回值,所以我们说确定参数就是在这个里边确定的step into,然后呢,Get method argument,呃,我们的values,这都是我们之前。
05:05
做的断定,先获取我们当前目标方法的所有参数的值,然后呢,照着这个参数值再来doing work,利用反射去执行step into进来再看好我们要获取所有的参数值,它先拿到我们当前方法声明的所有参数,我们现在呢,只有一个参数,这个参数呢,我们可以打开来看,这个参数呢,在我们的这个able,诶,然后呢,在这里边我们返回值类型是person,包括参数类型呢,我们现在只有一个参数,也是person,没问题,参数信息在这儿都有,接下来呢,就是一个增强for循环,先获取到我们第一个参数,第一个参数呢,相当于它是我们的这个参数类型是person类型的。然后呢,他来确定参数值,确定参数值先来到第一步,先来判断所有的参数解析器支不支持我这种参数类型的解析,来step into进来,我们来看一下怎么判断,好我们现在先来获取,来我们第一次获取呢,缓存中没有,所以得到的是,那然后呢,我们接下来就是增强for循环,我们判断,而且呢,我们给这个return result打一个断点,我们现在也不知道到底是谁,呃,能支持处理我们这种参数,所以呢,我们给result打个断点,我们先来看一下第一个我们的这个request power map map已经不行了,好,我们再来放行,Pass variableable,我们参数类型也不是标注了pass variable注解的,也不是pass variable注解带map的,也不是我们的这个矩阵变量,也不是矩阵变量带map的,哎,然后呢,Solid model attribute,我才来,放心也不是,然后呢,Request responsibility body也不是,相当于加了request body或者responsibility body这些注解的好,我们再来,还有一个request part也不是。
06:47
文件上传的也不是我们这个request head,请求头的也不是我们这个请求头,封装map的也不是我们这个cookie value也不是我们这个表达式的解析也不是我们这个session,也不是我们这个重递向携带数据的,哎,不是重递向是request attribute,相当于请求预属性的,然后呢,还有request method也不是我们这个,然后呢,有一个response method也不是,然后HVN应该也不是,好,我们放心,Rediretribute全重电项携带数据也不是。还有一个叫model method的processor,我们来看是不是也不是叫map method,相当于model map这两个在这呢进行匹配,也不是这个arrow,相当于它判断了一大堆,到底是哪个呢?我们就呃,慢慢的放行,还有一个so model attribute,我们来放行,诶,那相当于就是这个了,我们下一次呢,就应该流行这个,它是叫so model attribute method processor serve。
07:47
Light,呃,Attribute,我们的这个processor so a model attribute method processor,所以呢,相当于我们自定义类型的这个参数是用这个processor来进行解析的。
08:02
破九的这个封装过程,首先我们自定义类型的参数是用它来进行解析,所以呢,我们把所有的原理放在这目标方法执行完成,解析这个参数的值,解析这个参数值,我们在这儿呢,给大家再来扩展一下自定义类型参数。5.3应该是四四号好5.3我们这个自定义类型参数,也就是说我们这个封装O9,我们的pogo,比如我们要封装person,它呢是使用这个解处理器,这个参数处理器,这个参数处理器支持,那怎么支持呢?我们可以来测试一下。嗯,来到这儿,既然知道是他了,那我们下一次流星到他以后,我们便利到它以后,我们看他怎么判断支持的好,我把这个呢停掉,我们重新得bug起来。它是怎么支持我们这个自定义类型参数的,它是来做了什么判断,我们可以来看一下。
09:08
我们重新发送CU的请求,走起,好,我们直接放行,放行我们执行目标方法,好,来到这儿执行目标方法,再来到这儿执行我们这个目标方法,要确定参数,来到这儿确定参数,再进来判断我们支不支持,再进来,来到我们这个增强放循环,我们一个一个放行。啊,最后要流行,我们这个叫model attribute method process,好,来放行,大家注意这边来放行,这是呃,矩阵变量model attribute method process。是不是这个叫。我们叫model attribute process。那就是就是它怎么感觉这次放行很快就到了,So model attribute so,我们确定一下啊,So model attribute method processor so model attribute method processor啊就是它,然后呢,我们来step库,我们先来让他计算一下,计算一下它支不支持。
10:11
算一下哎,他return的是false,那相当于不是这个,那怎么感觉名字一模一样,我们再来找下一个啊。Model attribute。So late model attribute。这又有一个so model attribute method processor6025,相当于我们这个参数处理器里边so model attribute method process6025,我们来找6025。So model attribu6502,大家来看啊,这两个好像一模一样,So model attribute so model attribute method processor processor,我我好像没看出他们两个名字之间的区别,但是呢,我们是最后一个,这个能处理啊,这个呢,我们确认一下,确认一下。
11:12
幸亏老师觉得快,呃,把它没有放过去,好,我们现在这是一个处,好那为什么是处,我们step into进来给大家看一下,他在这儿呢,判断,首先呢,它是两个或者判断,第一个或者判断,看你参数有没有标注model attribute,它注解那我们肯定没标,然后呢,那接下来它第二个判断,第二个判断呢,第一个叫this a notation not acquire,就是我们这个注解呢,它不是必须的,确定是不是必须的,然后呢,接下来他在这来做了一个判断,叫being you is simple property,它判断的是不是简单属性,啥意思呢?非简单属性,那就是返回处,我来step into进来大家看一下step into先获取到参数的类型,我们把这一个呢,直接放行出去。再step into,我们来看这个is simple property,它是怎么判断的,它呢,在这是来这么来判断的,首先is simple value type是不是简单类型,我们先来看它两个或者计算这个或者计算呢,它不是简单类型,所以这是false,所以呢,接下来它就来到这叫type判断是不是数组不是,并且呢,要说呢。
12:20
我们相当于来到后边,后边这个如果是处,我们的整个呢,就返回的是处。走哎,我们这个呢,返回的也是false吗。我们来看一下啊。我们来看一下type is ray。计算,呃,我们来计算一下,这个叫is simple value type是不是简单类型计算,然后呢,这个result它给我们返回的,呃,这是一个,那我们自己step into进来就行了啊,前面大家注意,前面呢,这是一个false,他接下来判断我们这个类型,这个类型呢,因为我们是person类型,Person类型是不是数组不是,然后呢,FALSE1并且后边后边无论是处还是false,那都是返回到false,那么把这个呢返回过去,然后呢,我们来看一下啊,它在这判断its simpley,好,它在这呢,相当于是来判断是不是简单属性,我们这个呢,已经返回false了,非false就是true,现在它不是简单属性,怎么判断不是简单属性的,那就是在这判断its simple value是不是简单类型,所谓的简单类型就是你是不是枚举,是不是字符串,是不是数字,是不是这些,所以呢,你只要我们的这个自定义类型,Person对象都不是简单类型,所以呢,它的。
13:40
那判断这个是不是简单类型,它判断呢,是啊false非false呢,就是处,那相当于我们不是简单类型,所以呢它就支持了,那既然它支持了,那接下来呢,就放到缓存中,我们下一步就要拿它来进行解析了,所以我们接下来解析这个参数,所以呢,我们在这这一块的这个判断非常简单,就是是否为简单类型,因为我们这个pogo这种我们自定义类型,它不是简单类型来到这儿啊,我们相当于把这个是否简单类型的这个方法给大家直接复制过来,大家就看到了,所以呢,一判断诶你写的这一堆不是你简单的这些类型,是我们指定的这个POGO1大堆,那接下来怎么办呢?那接下来他就来到了处理环节,利用我们的这个reserve,我来step into进行处理,来看他怎么处理,先拿到我们这个reserver。
14:37
好,我们直接拿到这个reserve,拿到我们这个参数解析器叫model attribute muscle的process,然后呢,我们再来step into进来,Step into进来以后呢,它在这准备了什么?呃,Model and view container,这都是我们之前的东西,然后呢,大家注意他呢,先来获取model attribute注解,我们又没有标注model attribute注解,然后呢,接下来如果我们有注解了,它还在这什么帮点一大堆们没有注解,我们直接给它放行,然后呢,将来他判断model and view container里边有没有我们之前的这个东西。
15:15
这个name呢是什么叫person,相当于呢,我们自定义确定person类型这个参数的时候,如果我们以前给我们这个,呃,Model and view container里边有person类型的对象,它还会把以前的东西拿过来,拿过来以后呢,诶,这个attribute,再到下边我们现在呢,没有这个是我们后来说的这个model attribute这个注解的功能,因为这个注解呢,我们说场景不太常用,老师也没说,那么这个就过了前面的这个逻辑,大家也可以不用管管后边大家注意这呢有一个叫create attribute instance创建一个实例,所以大家注意啊,Attribute呢,目前为空,我们经过这一步以后啊,Step into进来,你就会发现我们经过这一步以后呢,会给我们创建出一个实例,它在这儿创建实例,我直接放行走,创建的这个实例是什么?我们来给大家看一下,会给我们先创建一个空person对象,为什么要创建一个空person对象,因为接下来就要准备。
16:15
给这个person对象6626里边封装我们页面带来的所有值了,所以呢,它上来先给我们创建一个空person对象,然后接下来这个空person对象接下来怎么办?如果绑定result等于空这个绑定result呢,就是绑定结果,我们这个空person对象呢,最终要跟页面的数据来进行绑定,而且呢绑定看呃有没有什么东西,所以我们现在呢,整个没有什么绑定结果,接下来它关键性的在这一步,我们的这个attribute就是创建的空对象web request就是我们原生的这个请求,相当于呢,我们就要将请求里边携带的所有数据封装到这个对象里边,它怎么封装,它先呢,利用这个border factory,相当于我们这个绑定工厂先创建一个web b,所以呢,关键核心就在这一步了,我们把核心的这一块代码拿过来。
17:10
我们把这一段的代码全部过来吧。然后我们自定义类型的封装核心在这儿,它会呢,先创建一个我们称为叫web方。什么叫web呢?就是web数据绑定器,所以呢,这是他最关注的一点核心。它利用了我们这个web数据绑定器。我们这呢有一个组件,这个组件呢,我们称为叫web数据绑定器,Web数据绑定器,数据绑定器它的这个作用呢,就是将咱们这个请求参数的值绑定到绑定到指定的渣B里边,而我们指定的渣B就是这个attribute,是他当前当之前给我们创建的一个新的空的这个person对象里边所有值都为空,然后呢,接下来大家看啊,这个attribute呢,相当于封装到了我们这个B里边,到邦里边的哪个就是这个target,这个PERSON6626,注意封装到这里边了,然后呢,这个帮里边不仅有我们。
18:27
准备封装的这个6626空对象,还有一堆这个东西我们称为叫conversion service,叫转换服务,在这个转换服务里边呢,有一大堆的CONVERT124个,因为大家想啊,我们要把请求里边的数据绑定到这个B里边,因为我们说请求传过来数据是HTPC,叫超文本传输协议,比是它默认认为万物皆文本,我们传过来的都是文本,那我把这个文本年龄18,这个18呢,相当于是文本,文本我就要转换成呃in这个数据类型,所以呢,它就会利用到我们这个数据绑定器里边的这些转换服务,转换服务里边呢,会有converts转换器,转换器里边一定就会有把string我们这个字符串能转成我们这个数字或者TE这种类型的转换器,所以我们给大家把这个呢打开,这就是我们说的内部的一个原理,什么原理呢?我们web数据绑定器会有把string转成我们来看。
19:28
有没有string转成英配之类的一大堆。这有string转我们这个欧债的数组的啊。这有转,诶这有死转转应配件的,所以呢,它会利用这些类型转换器最终在底层来进行工作,这个类型转换器呢,它的这个名,它的这个类名叫什么。哎,我又看一下啊,他的这个全名叫number什么什么,我们在这儿好像看不看不齐了。
20:01
叫叫number for Mar a notation format这个factory,哎,相当于是这个这个东西呢,就能帮我们把这个string转成英配,大家看注意看它的这个箭头,箭头相当于string呢,要变我们的这个配,那就是我们是利用这个转换器来进行转换的,所以呢,底层会有非常多的这些格式化器帮我们来进行数据来转换,我把这个呢给大家截一个图,这是它的核心原理,核心原理呢,我们这个web数据绑定器会最终把我们请求里边的所有数据,然后呢,利用我们这些converts转换器,然后呢,转换过来以后,给我们利用反射再来绑定到我们这个person对象里边,这就是web data bound里边的东西。那原理一句话,Web。利用它里边的converts。
21:04
将咱们这个请求数据转,嗯,转成指定的数据类型,再次封装,再次封装到咱们这个扎va饼中,我们其实呢,就能看到这个过程,我们可以来大概看一下啊,他呢,拿到我们这个get target对象,哎,拿到我们这个对象,拿到这个对象以后呢,对象只要不为空,大家注意叫bonding request peretter,然后呢,它传了一个bound,就是我们这个数据绑定器,绑定器里边有我们创建的空的person这个对象属性值多为空的person对象,然后呢,接下来把我们原生请求传过来,所以呢,只要我经过了这一步,大家看啊,我给这儿打一个断点,我这一步只要一放过去,我们这个B里边的这个person对象,大家看person对象张三是不是值都有了,所以呢,这一步就是关键一步。
22:03
诶,我们把这个窗口关了好,这一步呢,就是关键一步,就是呢,帮我们去来把请求里边的数据全部绑定进来的,所以想要看内部原理,大家只需要进去就行了,这一块呢,进去其实已经没啥了,都是利用反射获取请求里边的每一个参数值,然后呢,找到我们JP里边的这个属性,然后呢把这个池封装的属性里边,哎,就是我们这块,我们可以再来测试一下step镜two,大概呢给大家看一下,好,我直接放行到我们打的断点这一步。好,放行放行,放行放行,慢慢放行。主要呢,这就有一个叫web数据绑定器。走方形,好在这呢,绑定我们request permit,绑定请求参数step into进来看一下,他先拿到get request先获取到。
23:00
我们原生的request请求,然后呢,再把我们这个邦拿到,相当于我这是我们的帮它只不过转了一个数据类型,转成了我们这个solid select request data bounder,相当于要把我们select request里面的数据绑定到我们里边,然后再调用这个bound方法把原生的request传进来进行绑定。绑定工作很简单,进来看一下什么MPVS先获取到我们这个原生request请求里边的所有KV,对现在我们传过来的请求参数的这些KV,大家能看到参数它都拿到了,Edge是18,每一个参数呢,都被封装成property value,呃,Birth是呃,22019,然后呢,呃,Pet edge是五,所以呢,它相当于拿到了我们请求传过来的所有参数,然后呢,接下来。有一个叫and bound values,什么叫and bound values,就叫我们这个添加绑定的这个值,哎,我们来step into这一块呢,大家就能看到,就是各种便利循环,便利循环以后呢,好,我这这是额外我们要绑定的值,真正的功能就在这do step into,怎么do bound在这儿啊,各种先来检查,检查哪些属性需要被绑定,然后在这再do bound step into,然后呢,最终在这,你一听这个叫apply property values,像应用我们这个属性,大家看啊,这个属性呢,大家能看到我们的这个属性呢,在这都有,这有这么五个属性,把这些属性呢,接下来就要应用进去,应用到哪呢?Step into进来大家看啊,接下来就是在这个set property values相当于设置我们这个属性值,这个设置属性值是怎么设置的,大家可以来。
24:49
直接进去,进去这个方法我给这儿打个断点放行,到这儿拿到所有的属性值,看拿到第一个属性值,第一个属性值相当于AGE18,怎么设置进去的,调用它的set property value方法点进去这个东西呢,在底层就非常简单了,我们来直接拿过来,它呢在底层其实就是利用反射进行赋值,它呢利用它的这个反射工具property sor相当于我们这个呃,属性的访问器,先要访问我们的这个属性A属性。
25:24
但它最终呢,属性访问器会拿到看会拿到一个B音vaper,相当于来包装我们这个原生的person的这个vaper这个person的vaper呢,这个原生的person对象在里边,然后呢,接下来调用它的这个vaper的。先获取到这个原始值,我们不用管,然后呢,调用它upper的这个方法进行set value,对吧,相当于把我们的这个真正的值set进去,这呢就是利用反射设置值了,大家来进去可以看step into。再你再step into,一直往进into,这都是利用反射设置值,我们可以来step into,大家获取到我们这个handleler,然后呢,判断我们这个能不能读写来看啊,拿到我们真正的值18,然后呢,我们这个值呢要设置进去,然后接下来关键的这一步就进来了,它在这怎么要设置呢?好把我们这个值拿到,拿到以后convert for property,大家一定注意,我们这有一句话叫convert,什么叫convert,叫转换,因为大家看啊,我们现在拿到的这个值是一个什么呢?是一个字符串18,而我们真正的要绑定到我们原生属性里边的是我们的18,所以呢,它在这一块呢,先要给我们进行转换,Step into,我们进来,好,我们把这个出去,再step into,大家看convert if necessary,我们来判断是不是需要转换。再step into,我们先拿到。
26:56
我们这个类型,因为我们字符串的18要转成英特走,再次在into,大家会看到终于来到了我们这个转换器,对吧。
27:05
接下来他呢,接下来就会又是一个这个设计模式,他拿到我们这个转换器的这个什么代理东西,然后接下来大家注意啊,转换器还在这里边儿,相当于呢,有124个转换器,我想都不用想,我们这个数据相当于字符串18,要被谁能处理成我们的这个,呃,真正的数字18,然后呢,他就在这step into进来进来给大家拿过来看一下啊,他在这呢,拿到我们的conversion service conversion service相当于是我们的这个转换工具,它是拿到了哪个conversion service在这里边呢,有124个这个转换器,它怎么转呢?大家来过来给大家看一下啊。接下来拿到我们这儿,这有一个叫conversion service,看convert它先判断我们能不能进行转换,怎么判断能不能进行转换,接下来就来到了大家最熟悉的环节get convert water现在于它要获取到一个转换器,Step into,怎么获取到转换器,接下来大家注意先从缓存中拿,因为转换器只要找到一次以后呢,就呃不找了,缓存中有,然后呢,接下来第一次它就要找在所有的converts里边,大家看124个converts,大家想都不用想,这又是跟之前一样的设计模式,在这一个干嘛?增强for循环找哪个convert合适,所以大家看啊,在这儿呢,就是一个增强for循环找我们各种啊各种的convert water哪个能支持,所以呢,在这儿获取到我们能能用的这个convert water,看接下来就是一个边利循环啊,边利循环这个也不行,最终呢,诶,他找了两下,终于找到了一个string到。
28:49
康沃特,所以呢,大家会在底层发现非常多种这这些设计模式,我呢有124个卡沃特,我就来便利循环,我看谁能支持我们原生,原生的这个原类型是什么。
29:05
原类型呢是string,然后呢,谁能支持把string转成目标类型是什么?转成我们的这个配,所以呢,所有的东西都在这个gene conversion service里边编写着。我们也看到它的这个源码底层就是在这儿,Generate convertion service会把它里边所有的convert会在设置每一个值的时候,在设置每一个值的时候。的时候,然后呢啊,他会找它里边的所有convert,它里边的所有convert哪个可以将这个数据类型转换到指定的类型,其实呢,将哪个数据类型呢?将这个数据类型指的就是request给我们带来的request带来的参数的字符串啊,我们一般都是字符串类型,然后呢,转换到我们指定的类型,指定的,比如我们要转成音配置,这样必应的音配置,当然也有非字符串类型,比如我们文件上传,它就是一个文件流,我们把这个文件流如何,比如我们就会有把我们这个流如何转成我们真正的这个文件啊,让我们进行操作的,所以里边呢,都是它相应的这个转换器再来工作,而这些转换器呢,我们。
30:36
这个conversion service。Service,呃,我记得有多少个转换器呢?这个convert,这已经是帮我们拿到这个convert了啊,这已经是帮我们拿到convert,而真正的这个有多少个,其实呢,有非常多。非常多的这个convert,他在这儿打印的就是什么能转成什么,什么能转成什么,这都是它的这个描述,所以呢,大家也看到了整个底层的过程,所以我再来。
31:05
把请求里边的每一个参数拿到,我再绑定到Java b里边,我利用convert先来进行值的转换,转换完了以后呢,再来一步一步设置进去,好,Convert既然找到了,我们也不用管了,这个convert找到了。Converter找到了,我们接下来把它走完下来,我们拿到了这个转换器,接下来呢就调用convert的转换方法来step into,这个转换方法呢就非常啊,看我们原字符串18,我们要转成目标的应配18,大家看target类型是应配,怎么转呢?直接来到这source,我们不为空,好,我们来看啊,拿到我们的这个convert,这是我们的这个convert,把string转成number的这个convert convert不等于空下来,就利用它的这个工具来进行转换,Convertion us invo convert sta step into,相当于调用convert的convert方法,Step into,怎么convert呢?嗯,再进来。
32:03
来,我们再来,它又是get convert,它先是获取,呃,我们这个convert我先出来吧。先获取再来进去,好进行convert转换啊,我们最终的这个string转number用的convert叫string to number convert factory,然后呢,它里边的convert方法是这样的,叫string to number,它相当于给我们给了一个string to number的converter,它只是一个工厂,工厂呢最终给我们给了一个这个convert,只不过这是一个私有的,所以大家呢,未来也可以给你自己里边。未来我们可以给web bound web bound里边放入自己的放自己的convert,然后呢,我就能支持我们各种啊,你想到的想不到的类型,大家看啊,Convert的这个泛型是这样的,呃,String转成t string t的意思就是把我们请求参数带来的string类型转成你想要的这个类型,所以我们都能转,哎,所以呢,你可以给你里边放你的这个convert,而我们这个string to number convert来进行转换它的真正的convert方法很简单,我把这个断点打到这儿,我们想要转换,肯定调用它的这个方法。
33:23
就是pass number step into这个pass number呢,那就来到我们这个底层,如果你是BY,看你的这个number是什么类型,是BY类型,Short类型,还是应配类型,而我们呢,现在是配类型,那TE类型就调用TE对扣的方法,把我们的这个18进行解码,所以我来step into,哎,那这个方法呢,肯定没有出来,结果我再step into,调用我们这个应配折的抵扣的方法,诶我们这个抵扣的诶应该已经是解码完了,我刚才into已经into过了,好,我们最终呢,相当于我们这个convert,把我们这个值终于转换成了大家看配的18,转换成配的18以后才set y6,把我们这个值呢,最终设置到我们真正的这个属性里边,现在person这个对象里边,所以呢,这就是我们只是设置了一个属性,其他属性都是这个过程,它是来遍利循环我们所有的这个PV啊,相当于我们KV对,每一个KV对都要经历这样的过程,这样便利。
34:23
循环变利循环convert转换,然后复制到Java be里边,Convert转换复制到Java be里边,复制完了以后,我们整个JA be的封装就结束了,像web b的在这一步棒的就结束了,它一棒的结束以后,而且绑定期间如果有任何异常,他呢也会给你把这个异常结果给你放过去,我们以后呢,只需要使用帮ing result就能获取到异常结果。这是我们以前也讲过,Spring m Mac说来进行数据校验的时候,拿到校验错误怎么拿,那就是在这一块啊,它有源码的生命,好,这是我们整个自定义对象的绑定,我们希望大家呢,最终掌握底层,我们有一个叫web ber weer里边呢可以拥有非常多的converter,我们也可以自定义converter,最终来实现我们将任义类型转成我们想要的类型,而且呢,我们spring m VC在底层来我们再来讲spring mvc自动配置原理的时候。
35:22
我们说spring m VC帮我们自动配了很多东西,其中呢就有包括一个这个东西叫我们的这个什么东西呢?看有converter former,诶就是我们说的这个generic converter这个东西呢,它帮我们自动配好了,我们之前呢有好像有200多个这个converter都是在这儿,包括呢,它也帮我们自动配好了web data,相当我们这个数据绑定器,如果这个数据绑定器里边有你不满意的,你也可以自定义配置,因为它呢是使用我们这个con reb web web Bing initial拉帮我们自动配合的。走进来,它呢是帮我们在这来自自动的给我们容器中配了一个咱们这个数据绑定器,来看谁调用了它,你点一个它来看谁引用了,就是web mvc configuration,它在这引用了,然后呢,它在这利用我们的这个web MC configuration,就是spring mvc,我们的这个自动配置类,利用这个自动配置类,它呢给容器中配了一个。
36:27
配了一个我们这个web data邦,哎,我们这数据绑定器,这个数据绑定器呢,它是利用这个引力收lazer利用我们这个初始化器给我们配到容器中的,而且呢,Conversion service也是从容器中拿的,所以呢,我们以后啊,我们来点进来这个初始化器呢,给我们容器中,怎么就把这个数据绑定器创建过来了,来找它的初始化方法。在这引匿帮相当于呢,他帮我们在这给我们的数据绑定器里边设置了各种东西,其中就有我们的conversion service啊,类型转换器,因为这个类型转换器里边我们说它拥有非常多的什么东西啊,Converter啊。
37:10
它里边的这个东西呢,我们用的一个是generic generic里边呢有非常多的这个convert,这些convert呢,就是来帮我们来进行类型转换的,而convert的总接口就是这个source type和target type。这是convert沃特的总接口,Convert沃特的总接口好,这是我们说的自定义数据绑定的原理,大家在下边呢,可以来回顾一下我们整个的这个过程。
我来说两句