00:00
好,那接下来在我们来写实验之前,我们再来了解一下spring boot底层对我们spring l VC到底做了哪些自动配置,包括我们该如何扩展,如何定制,只有我们把这些呢都掌握清楚了,我们在后来写实验,用起spring m VC来才能得心应手。当然这一块的知识呢,我们可以从两处获取,第一处呢,我们自己来分析spring book的自动配置源码,看里边有什么功能,第二处呢,我们来参照官方文档,看官方文档里边写了什么功能,当然我呢就结合两处,我们看官方文档告诉我们自动配置了哪些,再来带大家翻一翻源码,我们希望通过这一次的分析,那么后来的所有模块原理都是一样的。好,我们打开咱们这个文档,在我们这个第三章、第四章,第四章这一块呢,在27节有一个叫开发web。
01:01
应用这一块呢,他说了咱们这个怎么来使用我们spring l VC框架。什么MC的自动配置呢,它都在这,哎,说清楚了,我们来看一下。首先呢,他我们如果要用spring mvc,那就直接上手用就行了,因为所有的东西都自动配置好了,就像我们hello一样,我们可以非常简单的来使用一个哎,咱们这个springc,那到底他做了哪些自动配置呢?这一块列举了这么一段话,这一段话呢就是我们哎,Spring BOO对spring m VC配置的精髓,我们来跟着官方文档一起来慢慢分析,首先他说哎spring BOO呢,提供了spring VC要工作时大多数场景的自动配置,哎,Spring,那就一句话自动配置好了,Springvc。而都配好了哪些,下边有列举,以下呢是咱们这个w boot的默认配置,以下是。
02:03
显示对VC的默认配置。当然要看懂下面这个东西呢,我们需要对SPAVC的原理哎,掌握的比较清楚,如果这一块还不清楚的同学,可以参照我们鼓励学院同刚老师讲的spring VC课程,那么呢,我就来给大家一个一个来分析一下,第一个他说呢,我们这个自动配置包含为我们配置了content negotiation view和咱们这个name,而这些呢,其实我们都叫它自动配置了,咱们叫我u reserver,就是我们的视图解析器。而这个视图解析器呢,在spring mvc中,哎,它在spring mvc中的功能呢,就是根据我们方法的返回值。返回值能得到视图对象。
03:01
这个视图对象呢,就是我们这个无右对象,然后呢,我们视图对象决定是转发还是重对象啊,或者怎么到一个页面,视图对象决定如何渲染,决定来如何渲染,这个渲染呢,所谓的渲染就是是不是要转发到页面,还是重定向到页面啊,还是怎么样等等等等。我们呢,可以来看一下它的底层原理,我们打开CTRN,打开类搜索,我们来搜索web mvc auto configuration spring m VC的自动配置,在这个类里边,我们来看一下有没有他说的这个content negotiation,我U呢来复制过来CTRLF来搜索,搜索这个content negoti action,我又so来看一下,诶这块呢,确实有这个配置,而且an b给容器中来添加咱们这个组件,它添加了咱们这个无u reserver,而这个无u reserver的功能我来点进来给大家看,既然是视图解析器,它就要解析视图,它怎么解析视图呢?我们来往下边翻,它在这解析视图,解析视图的时候呢,掉俩方法,第一个叫获取我们候选的视图对象,然后呢,选择一个最适合的视图对象,然后把这个视图对象返回,我来点进来,而他怎么样选。
04:25
好,我们这个视图对象呢,它其实是干嘛啊,把所有视图解析器拿来挨个来解析,然后呢,我们这个无忧reserve,它的作用呢,其实就是哎,组合所有的视图解析器的,那既然是这样,我们来看一下他的这个组合逻辑,他呢先用了一个这个content view,而他要用到这些所有的视图解析器,它是从哪拿着呢?我们来看一下这个视图解析器,我来往下翻。往下翻,这呢有一个初始化方法,诶,而这个初始化方法呢,我们来看啊,它是呢,从用冰方水工具从容器中干嘛获取所有的视图解析器,把这个视图解析器呢,就作为它要组合的所有视图解析器了,那说明如果我们要写视图解析器,我们只需要我们如何定制。
05:25
如何定制,我们呢,可以可以自己给哎容器中添加一个视图解析器,然后呢,我们这个content negotiation will receive就会自动的将其组合进来。哎,那是不是我们分析的这样呢,我们可以给大家来测试一下,比如呢,我们就在我们这个主类里边,好,我们就不写那么复杂了,我们就在这里边呢,我们来给它返回一个视图解析器,我reserve来,我们就叫my view reserve。
06:04
我们来返回一个我们自己的视图解析器,让它添加到容器中啊AT1,那这个my view reserve呢,我们还没有我来写上一个,我就直接在这里边,我来写一个静态的内public static class,我就叫my view。Solve既然要是视图解析器,那我们就应该是实现无U接口。好,然后呢,我们来添加未实现的方法,把把咱们这个光标放在这alt counter键给提示好未实现的方法点一个OK,那我这个方法呢,我也就不实现了啊,我主要呢就来拗一个my view,我们看我们有没有这个起作用就行了,怎么看起作用呢?我们来给我们来CTRLN搜索thispart。
07:01
Server,诶,Dis serve呢,所有请求一进来会来到do dispatch方法在咱们这个924行,我们可以快速的按照C加这键来到我们这个924行,哎,它就锁定到这了,好,我呢就给这打一个断点,看我们dispaure里边用到的视图解析器是什么,好,我以debug的方式来运行。启动起来以后呢,我们随便来访问一个请求。好,还是我们之前这个success,我们来看对象来它的好多组件,这是国际化功能的文件上传的handle maping adapt,我们来找视图解析器,在这六个,当然呢,第一个就是这个content negotiation啊,我们打开,打开呢,这无里边来找一下我们的,诶在这啊,MYU,我们的确实进来了,比后呢,我们要做的只是给容器中来添这个组件就行了,它自动就加进来了,那后来的所有逻辑呢,基本都一样了,我就来以一个演示为例。
08:14
那这个呢,说明我们这个猜想是正确的,所以我们以后看东西啊,我们就看关键字,哎,他从哪拿的,我们看关键字不用分析的name细节好,剩下呢,还有咱们这几个叫支持静态资源的,诶静态资源首页包括fair I这几个呢,我们之前说过,哎,这是静态首页访问的。还有呢,咱们这个点r Co好,包括呢,我们这个是咱们这个静态文件夹,静态资源。资源。文件加路径和咱们这个web JA web jas,哎这个呢,我们之前都来用过,我们就不说了,然后呢,来看它额外额外这呢,还说自动注册了convert water这些东西,诶我们来说一下自动。
09:14
自动注册了convert water什么form,我们来说一下这个convert water format convert water呢,这个翻译过来就叫转换器,它的作用呢,就是将咱们这个我们来看啊,我们来假设呢,有一个方法public string hello来我们有一个user,我们发请求呢,来到这个方法,如果说我们页面带来的数据跟user对象里边的属性正好一一对应,Spring m VC是不是要自动封装啊,但是在自动封装期间一定会出现是不是类型转换问题啊,比如页面提交了个18,而这个页面提交的数据啊,都是文本,所以呢,我们要把这个18转成啊之类的类型,或者页面提交一个处,这也是文本要转成布尔类型,所以呢,我们这个类型转换使用。
10:03
使用咱们这个convert组件,而对应的呢,还有一个叫form,这个就叫格式化,格式化。格式化,这格式化器的作用呢,也是一样,我们页面带来的数据,比如页面带来一个2017年12月17号,我们呢就要把它对应转成一个date日期类型,所以呢,这个其实就牵扯两个方面,一个呢是把我们字符串转成日期类型,第二个要按照这种格式转过来,因为有些国家可能不一样,他们的写法可能还是这种,那么有些呢,可能还是点,所以说呢,我们要按照一定的格式转过来,就要用到这个格式化器,它也自动注册了,我们看它自动注册的在哪呢?哎,我来往下翻一点,这是来自注册的国际化内容的,你看啊,这有一个格式化器,格式化日期的,包括这个日期格式调整,哎,我们都能用spring m VC data form来调整,是不是呢?哎,我们来看啊,它确实注册了格式化器,而注册的这个条件。
11:16
对。他在这儿注册的这个条件是什么呢?我们来给大家打印一下这个条件。找这个条件呢,就是说如果我们配了这个日期格式化它呢,就会注到这个格式化器,如果没配,那我们就不注册了,就说呢,我们现在是需要在配置文件中配置我们日期要用哪种方式格式化过来。在文件中配置日期格式化的规则,哎,我们要配置这个。而我们配了这个以后呢,它就会给我们加一个叫date日期格式化组件日期。
12:09
格式化走向啊,那如果我们没配,那自然没有了,但是我们来注意啊,下边呢,我们再来往下翻一点,下边呢,还有一个方法叫and forms,添加我们这些格式化器,它呢给咱们这个格式化器的这个注册中心里边要添一些东西,而这个东西添的时候怎么填呢?又注意关键字叫get being of type,这个呢,我们来看啊,它是怎么get呢?这个方法就在它的下边,就在它下边,它是拿到B方,也就是我们的这个容器,从容器中呢获取所有类型的convert,然后把它们呢,你看啊,挨个遍利填过去,所以说又看见这个关键字,我们又得出一个结论,我们自己想要做能不能做啊,我们也可以自己。
13:00
自己添加的咱们这个格式化器,包括呢转换器,我们只需要干嘛,只需要放在容器中即可。那这个东西呢,哎,我们就不用不用像以前这样测试了,大家可以在下边测一下,填进来肯定能用,所以呢,我们就来看这些关键字,包括呢,它还帮我们呢配置了叫HTP功能,HTTP,我们得说一下这个它的作用是什么呢?诶,Message convert,我们叫消息转换器,这是spring mvc里边用来转换HTTP请求和响应的,诶举一个例子,比如我们有一个方法返回了user类型的对象,我想把它以jas数据的方式写出去,那我们呢,就需要有一个能把user以jas方式写出去的message convert。
14:02
而这个message convert water,它是怎么在容器里边配的呢?我们来把它找到,来搜索一下这个message convert water,看哪里有配置,诶,在这儿啊,在这一块有message convert,而注意这一块的message convert呢,也是在一个配置类中,这个配置类跟我之前的写法一样,在我们这个大配置类中有一个小配置类,那这个配置类呢,一起作用,首先我们来看啊,这个配置类只有一个有参构造器传入这个convert,而且这标了atz呢,就是懒加载,我们在用的时候才把它自动注入进来。而这个convert是什么呢?大家来注意啊,如果说只有一个有参构造器的情况下,每一个参数的值都是要从容器中拿的,相当于convert,怎么确定值要从容器中确定。哎,这些message converts。
15:02
是从容器中确定的,确定什么呢?我们来看一下这个message converts点进来,它其实是一个http convert,也就是我们这个convert的,你看啊,包括这个类,它呢,也是有参构造器,诶,是我们这个age convert的啊,这个可变数组了或者集合,就是说呢,是要从容器中获取所有的convert。它的底层就是从容器中啊,它是获取所有的,也就是说如果我们想自来个HV message,我们还是那句话,哎,自己给容器中添加。添加我们这个HTP,只需要将我们自己的组件我们放在容器中。
16:03
也就是说我们注册在我们就叫注册吧,注册在容器中,比如用我们哎,用我们这种方法,按它being的方法啊,或者什么component啊,反正你把它扫描进容器里边都行,那是不是这样呢?我们也可以看一下官方文档,连官方文档都有说你看这message converts,他说呢,默认都帮我们配好了,有做Jason的还能帮你来转的,但是如果说你我们自己想要用一个怎么办呢?而且我们是自己给里边添加一个啊,怎么办呢?我们你看啊,它呢,就是给这message converts,它来用一个message converts放在容器中,所呢我们给容器中来添它就行了,好。这就是我们这个的自动配置,还有接下来的两个自动配置呢,我们就来看一看就行了。哎,把这个高了。一个叫呢message code,咱们这个消息的这个什么解析的,我们来把它复制来。
17:07
来看一下,来看一下这是什么东西呢?有没有人配它,诶这有一个叫message code reserve,然后呢,它的这个配置呢,你看啊,我们主要来看它还能从配置类里边拿一个配置啊,我们不看这个组件,我们来看这个配置,点过来这个配置,这个配置呢是它,它里边呢是咱们这个format,我们点过来,其实呢,我们来看到这个是来定义咱们这个错误代码生成规则的,比如我们在做GSR303数据校验的时候,某一个字段发生错误以后,是怎么样产生错误代码呢?这有一个错误代码,对象名、属性名,这是第一种规则或者第二种规则,你用对象名属性名加错误代码,然后这是来定义错误代码生成规则的,好,我们知道一下就行了,定义错误代码。生成规则的。
18:01
那我们来看最后一个叫comfortableable webing initial,这web initial这是什么呢?我们来先来搜一下它在哪里边有这个配置。我们来看一下咱们这个自动配置类里边web border引力说来,诶下边有啊有这个配置呢,我们来发现啊,我们别的不看,我们就来看它,这有一句话叫什么鼻音翻,从容器中拿这个东西,也就说呢,我们啊相当于也可以来配一个。我们我们可以配置一个这个来替换默认的。因为它是从容器中拿的,哎,我们呢,也只需要给容器中来添一个这个组件,哎,我们要添加到容器中。那这个是什么作用呢?我们来看一下它的这段代码,而它这是从容器中拿,而且拿不到,它会调用super,调用咱们这个负类的super的这个方法,我来点进来,Super的这个方法呢,帮我们来创建一个这个initial LA,而这个initial LA它的作用呢,是来初始化我们这个web数据绑定器实例的啊,它的作用呢是来初始化。
19:27
初始化web数据绑定器的,而web数据绑定器的功能是什么?其实就是我们把请求数据,哎,比如呢,我们要绑定到我们这个Java并应中,哎,我们发过来的请求带了几个参数,我们要封装叫我们U的对象里边,那么接下来呢,我们就需要用到咱们这个数据绑定器,而且数据绑定器里边牵扯到类型转换,格式化啊等等,还会用到前面的组件,这都是spring VC之前的底层原理,包括呢,我们来看一下这个啊,Webing点进来来看一下它这呢有一个方法,哎引bound,就是来帮我们来做初始化我们这个web数据绑定器的。
20:13
当然,我们的核心就在于这一块,要想换,我们给容器中放一个就行了。但是呢,我们自动配置的这个功能可不止有这么多,我们只是分析了一下web mvc这个类,然后BOO对我们整个web的配置呢,我们都可以来到这个包里边,我们这有一个叫auto spring BOO的auto,然后呢,我们在org framework里边有一个包叫web,你看啊,这里边呢,我们就来分析所有的什么configuration这些类,这类呢都是对外部场景的自动配置,当然我呢就不一个一个来说了,我们呢说这个自动配置,好多同学呢,对里边我们要用的这些组件功能可能不是很了解,把这个。
21:06
报名来引用过来,然后呢,自动配置web的所有自动配置场景。好多同学呢,对人家spring boot给容器中添的这些组件功能可能不是很了解,这需要呢,哎,我们对spring mvc深入了解以后呢,慢慢再来掌握web的一些配置,但是呢,我们希望通过来说这个自动配置来给大家提供一种模式和思想,什么思想呢?就是我们如何修改。Spring boot的默认配置,如何修改这个默默认配置呢?首先来看这些呢,都是统一的一个模式,我总结的这个模式呢,不只能用于外部模块,其他模块都这样,那我们想要修改默认配置的第一个配置,其实我们看我们之前我们要想填格式化器,我们放容器中就行了,哎,我们要填message convert也放容器中就行了,我们要换它,我们给也放容器中就行了,等等等等好多功能的组件,我们都是给容器中放一个就行了,为什么呢?因为spring boot在底层设计大量用到了这些细节,比如在外BMVC里边,我们BOO想要给容器中配一个黑htp filter,这个呢是来支持rest风格的过滤器,但是它要给容器中来注册这个being,它怎么做呢?诶,它是这样的,Conditional啊,Miss being。然后呢,先判断容器中容。
22:40
如果说没有这个组件,没有这个类型的组件,然后呢,它就给容器中有一个放容器中,我们还是之前说的那句话,只要这个组件在容器中了,就能想办法让它生效,至于是怎么生效的,我们后来可以慢慢来体会,然后呢,我们先来说第一个模式,就是。
23:02
在用很多组件的时候。哎,在自动配置很多组件的时候,都有一个模式,什么模式呢?就是说先看容器中,容器中有没有用户自己配,然后如果我们用户呢,自己用B啦,或者呢,Component啦,我们扫描了一个相关的组件已经进入容器中了,那么我们他就啊,如果有,如果有就用用户配置的。如果没有呢,如果没有才自动配置呢,好多代码都是这样,包括呢,我们容器中的这些组件,如果说有些件呢,要确定多个,它把用户配的这些组件会跟它自己默认的都合并起来,如果有些组件可以有多个,比如我们的视图解析器view reserve,它呢都是想办法,它是将啊,它是将用户配置的。
24:11
和它自己默认的组合起来。所以呢,这就是第一种模式,我们想要修改默认配置,那在很多情况下,我们给容器中添加一个组件就行了,Spring boot呢,就会优先使用我们的,当然这不是所有的情况,比如人家这一段话就说,如果我们说要保持对MVC来配置的这些功能,而我们呢,还想添加一些额外的功能特性,比如我们要添controller啊,我们这些intercept,我们这些拦截器等等,那我们要做怎么做呢?它这说了一段话,所以呢,接下来会有第二种配置模式,但这个第二种呢,我们下一课来给大家仔细来解析。
我来说两句