00:00
来第二个就是我们说的自动配置,那我们通过刚才的这个hello word呢,我们体会到它帮我们自动配好了这么多东西,和第一个自动配好了Tom KT,不管自动配好什么东西,肯定呢需要两步,那第一步就是你想自动配好tomd,我们必须先引入tomcad依赖,引入咱们这个tomcat,而引入Tom KT依赖呢,这些是前边的依赖管理,我们在引入web场景的时候,Tom cat的这个starter就被引入进来了,我们可以来看一下,我们在这呢引入了一个web开发场景,Web开发场景里边默认给我们引入了他们cat的场景,所以呢。正因为有了支持,我们引入了tomcat依赖这个场景,那我们tomcat的这些炸包才能进来,那这进来以后呢,接下来他做的第二步事情,那第二步事情呢,那就是我们这个配置Tom KT,那至于他是怎么把Tom KT配置并启动好的,这就是我们后边在自动配置原理里边要研究的东西,但是我们现在呢,大概先体会一下,那第二个就是我们自动帮我们配好了spring m VC,那同样的它也引入了spring mvc,因为是start web这个场景里边帮我们来引入了spring mvc,我们可以确认一下start web里边除了他看的场景,把我们spring spring mvc的这一堆包也引进来了,所以呢,我们还是两步,第一步它引入了spring mvc开发的全套组件。
01:26
然后呢,第二步它自动配好了,配好了咱们这个spring l VC常用功能,常用咱们这个组件,也就是我们说的常用功能,哪些常用功能呢,我们来给大家体会一下,比如如大家如果是以前整合spring spring mvc spring配置文件里边,你要写一大堆的东西,那我们随便去网上来找一个,我们看有没有人我们说一个spring spring mvc的整合,我们来看他写了什么,帮大家来回顾回顾一下spring spring m VC整合我们就叫整合吧,好,我们来搜索一下,好,我们随便来点进来,就第一个我们来看这一篇spring spring mvc整合里边,它其实我们以前呢,要写一大堆东西,比如我们在web插二里边,我们最先要配置的肯定是spring,呃,MVC的整个dispaure,他帮我们来拦截所有请求,那相当于我们spring mvc要工作,我们dispaure也得有,所以呢,我们可以来这么来看一下。
02:26
我们的整个这个应用里边有没有帮我们配Dis,首先呢,我们application这一行代码,我来到主程序,它会返回一个叫conable application test contexttest,也就是返回我们的IOC容器,这是返回我们这个IOC容器,这个容器里边呢,就包含了我们当前应用的所有组件,我们可以来查看容器里边,容器里边的组件,那只要有我们这个组件,说明这个组件就能工作,至于怎么工作的,这就是我们后来的原理。那么先来看有哪些组件,有一个叫get being DeFinition names,获取所有我们组件定义的这个名字,我们把它的这个名字拿过来,我们大概跟名字来判断,我们就知道有哪些组件,我们来做一个遍历打印name。
03:18
好,我们现在来启动起来,我们来看一下我们这个应用启动boot给我们装载了多少组件,我们要想要的这些配置有没有,哎,我们下边打印的每一个换方打印的这些都是一个组件,挺多的,那首先第一个就是如果我们以前要配的话,肯定得有dispaure so light,那我来搜一下有没有dispat dispaure s相关的东西,诶我们发现呢,有一个组件的这个名字叫dispature,有这个小写的,那它肯定就有相关的这个组件,然后这是第一个,第二个我们要整合spring spring m VC,为了解决字符乱码问题,我们以前要配一个filter,叫T开coding,我们的这个filter,这个呢,能保证我们编写的这个东西,我们返回中文的时候不乱了,好,我们可以来加上一个中文。
04:08
你好,我们看一下我们是不是这个应用能解决乱码问题,来让它重启一下们来重新访问,Hello,请求看我们这个应用是不是乱码,稍等一下。好,现在来启动成功,我来刷新,诶这块呢是没有任何乱码的,没有乱码的原因是它也帮我们配置好了,我们称为这个叫字符编码的这个拦截器,我们可以搜一下,诶我们发现呢,字符编码拦截器这个组件在我们这个容器中也是有的,包括我们想要做文件上传,我们以前整合spring spring mvc,那spring mvc要得有视图解析器等一大堆,那我们来搜一下有没有相关的视图解析器相关的东西。CTRLV,好,我就来搜一个view server,我们也发现了非常多的这些view server,也就是有相关的这些视图解析器,包括我们再来搜,我们想要做文件上传,我们以前要配置我们这个文件上传解析器才可以,那我们有没有文件上传功能,走诶我们发现呢,这也有文件上传功能相关的组件等等等等过多的例子我就不举了,所以呢,我们说明了一件事情,就是我们spring boot已经帮我们配置好了spring lvc的所有常见场景,Boot帮我们配置好了,配置好了,配置好了咱们这个所有咱们这个开发web开发的场景,Web开发的常见场景。
05:33
因为我们看到了组件在容器中有,那在容器中有它最终就会生效,那至于怎么生效,我们是后来研究的事情,所以呢,我们已经看到了这些事情,然后呢,包括spring boot给我们自动配置里边也给我们配置了一些默认的包结构,怎么叫默认包结构,大家想以前我来整合spring mvc,我们得指定,哎,我们的这些ctrler都在哪个包下,你得指定包扫描等等一大堆的规则,但是我们发现我们没有配任何的包扫描,只要我们写的这些CTRL组件他就能发现,那原因在哪,在哪呢?我们官方文档也说的很清楚,官方文档在我们这一块有一个,呃,我们构造我们的这个代码有一个默认的这个包扫描规则,那呢,默认的包扫描规则,就是说我们的这个主程序,我们比如我们的主程序,它是这个示例,主程序呢,在这个包下,只要是主程序它下边的子包,或者下边的子包里边的所有组件。
06:34
它都能被默认扫描到,所以呢,这就是一个默认规则,主程序所在的包,主程序主程序所在的包及其及其。下边那所有纸包都里边的组件,里边的组件都会被默认扫描进来,默认咱们这个扫描进来,所以呢,这就解释了,我们连包扫描都不用配我们的CTRL了,就都能进去,但是呢,另外一种就不行了,比如我的主程序在这,然后呢,我们的目录层级是主程序所在的包是boot包,我要在boot包外边,我建一个CTRL,我来给大家看一下,来建一个类,我是在and硅谷,这里边我有一个啊word controller,我们刚才有个hello controller,我们再来整一个word controller,我们明显能看到word controller呢,在主程序包的外边,然后我如果还给它标这些注解,有没有用呢?我来加上一句话,Rest controller,我来处理一个请求,String来处理word请求,WORD666,对吧,我们随便写一个方法名,让它返回一个啊,Word好,我们就来返回这个字我们来。
07:48
处理一个请求叫request map,我就来处理什么请求呢?你给我发送W请求,然后呢,我就给你返回word这个字符串来重新启动,我来测试一下我来给当前项目发送杠W请求,能不能达到这个效果。
08:04
杠W回车,哎,我们发现呢,它给我们响应了一个默认的404这个页面,也就是找不到,那只有说当我们把这个word我们放在跟主程序同包,诶那现在呢,跟主程序是同包,或者它的子包及其它的各种孙子包里边,那都可以,好我们现在重新来启动一下,我只要跟它放在同样的这个包结构里边,我们看一下我们的最终效果。好,我再来刷新,诶,我们发现呢,我们这个程序就生效了,所以呢,这是spring boot给我们又自动配置了一个东西,就是默认的包结构,也就是说我们无需配置以前的包扫描,无需以前的这个包扫描配置,但是有些同学说,那我非要把这个东西,哎,Word ctrler,哎,我非要怎么呢,把它放到come at硅谷,哎,我就要放到这个外边,哎,我就不跟主程序放在一起。
09:00
大家看它呢,直接在我们这个and硅谷这个包下,我还想要发现它行不行呢,其实也行,怎么也行呢,你可以在这这一块spring boot application里边,呃,我们呢,这个里边呢,有一个属性啊,我们可以给大家临时扩展一下,里边有一个什么属性呢,叫SC,呃,我们来扫描的基础包,我来指定一下就行了,我要扫描的基础包就是com点硅谷,我们把整个包呢层级放大一点。让他来进行扫描,那我们刚才那个就能进去了,那以前这个是进不去的,现在我来重新启动。那么再来测试,看能不能进去。我们再来访问W-W请求以前不能访问,现在我来刷新又是能访问,所以呢,你非要改变我们这个包路径也可以,哎,如果我默认的包结构必须放在这儿,如果想要改变,想要改变扫描路径,想要改变改变咱们这个扫描路径,那我们就呢,就可以使用这个,呃,改变或者或者。
10:06
或者我们也可以使用另外一个,我们明确的来指定我们还有一个注解,哎,我们后来还会说有一个叫component scan注解,就叫包扫啊包扫描,那大家会发现我们以前MVC里边配置的这些东西,对吧,我们在这呢都能写,但是这个包扫描呢,因为spring boot application它里边呢已经写了这个包扫描,所以你在这儿再来指定包扫描,这是一个不能重复的注解,所以你在这呢就没办法写了,但是我们可以在后来我们再来说这一块我们该怎么写,所以我们也可以使用这个,我们来把这个注解,我们在后来也会给大家演示。我们是来使用它,或者使用它来指定我们这个扫描路径,那也是可以的,那另外一种,如果你现在有些同学说我非想要呃完成这个事情怎么办呢?我们看到spring boot application这个注解其实是一个合成注解,除了我们注解的这些圆注解信息,那我就把这些合成注解我直接复制过来,CTRLC。
11:07
它呢一个顶这三个,而在这三个里边,我就把包扫描改一下,其他注解是什么意思,我们后来再讲包扫描路径,我们重新改成。com硅谷,那也是一样的效果,走起。来测试一下最终的效果。好,我来刷新,好,我们同样的能能扫描到,但是呢,如果我们是写了boot application,默认呢,相当于component sc就是SC到哪呢?SC到我们主程序所在的包就是在这个包下,如果在这个包下,在boot包下,那我们的这个word controlrler就不能被扫描到,杠W请求就没法访问了,我再来确认一下啊。一个它就等于三个他。我们来刷新一下,哎,我们又回到了404,所以我们来回归,哎,我们大概把这个总结一下,我们之前说的这一个它。
12:08
来,我们来加上我们的这个。这好,我们一个,它就等同于等同于我们三个这种写法,然后呢,我们可以在这种写法里边,哎,我们来指定我们自己的扫描路径,然后呢,另外我们自动配置里边很多东西帮我们配好了,而且呢,它拥有的默认值,比如我们tomcat拥有默认端口,包括我们spring mvc配置的这些东西也都有默认值,比如我们文件上传,对吧,我们跟文件上传有关的。我们可以大概看一下,那我怎么知道文件上传要配哪些呢?我先给大家来漏个分对吧,透个气,我们后来再说文件上传里边有猫,我们来web里边点multi part,我们来看一下啊,我们来有没有文件上传点我们文件大小,我们看有没有规定文件大小非看那有一个multi part非size,相当于我们最大一要求文件上传多大,这都有一个默认值em MB,而我自己可以改呢,是MB,所以我们以后想要改的任何配置,我们直接只需要通过一个application properties这些文件我们就修改就行了,而且呢,这些配置其实你点进去你就会发现他们其实是绑定一段这些Java类的,这个都是我们后来要说的事情,所以说呢,所有东西都有默认配置,这个默认的值,默认的值,它们都是这些默认配置,默认配置都是来默认配置最终。
13:45
都是哎,映射到的某一个类上的,哎,比如我们这个multi part properties类上的这些属性里边。映射到这些里边,甚至于呢,我能不能在我的容器里边的所有组件里边,我来找到这个multipart properties,哎,我发现呢,都能找到,你能找到它,说明我们容器中有它的这个对象,这个对象里边这些值是什么?那就是跟配置文件绑定的,所以我们的配置文件的值,配置文件的值值最终会绑定到某个类某个类上,然后呢,这个类,这个类会在容器中,会在容器中有。
14:30
创建对象,所以呢,我们以后要用到我们这些默认值的时候,在spring boot的底层就拿到这个类的对象,提取出它的默认值就行了,那至于怎么绑定上的,那又是我们后来研究的这个,呃,这个内容,然后呢,并且我们这些配置呢,也都是按需加载的,那么这个按需加载呢,举一个例子,我们boot,我们能以前看到有非常多的非常多的。
15:00
多的咱们这个场景start,这些start难道默认全部都启动吗?不是,我们只引入了一个start,就是我们web开发场景,那么SW boot就只会把web里边的这些配置给我们默认开启,我们没有引数据库开发场景,数据库的就不会开启来,这个配置原理我们在后边也会详细讲,所以呢,我们引入了哪个场景,引入了哪些场景,那些引入了哪些场景,这个场景的自动配置才会开启,那为什么呢?其实smart boot对于所有东西的自动配置全部集中于这么一个包,我们来看spring boot starter web web呢,依赖spring boot starter,在这个starter里边呢,有一个包叫spring boot auto conak,所以呢,所有的自动配置,你按照翻译它叫auto con fer自动配置,所以spring boot的所有配置,Spring boot所有的自动配置。
16:00
功能,功能都在这个里边,都在这儿。把这些去掉,好,都在这个长这个包里边,好,我们可以来给大家看一下这个包里边儿到底有什么。Boot start auto confi来点开auto confi,然后呢,这个包里边我们来点点开org boot auto confi,然后呢,我们会看到,诶,这其实就是全场景,S boot做am的,然后呢,做A的,做切面的,包括s boot做编解码的,然后呢,包括我们做缓存的,批处理任务的,所以所有的场景,其实人家的这些自动配置全部都写在这儿了,我们未来会见到非常多的什么什么都什么auto configuration,你一翻译你就知道这叫自动配置,但是这些自动配置呢,不一定全部能生效,然后呢,我们看到这个类我们点开有很多都是发红的,对吧?这些发红的呢,那也就是不生效,至于为什么不生效,又是我们后来研究的事情,但是我们能知道的一点就是我们有了什么场景,这个场景才能生效,如果我们想要做批处理了,我们只要把批处理的场景导入进来,这些就不发红了,来给大家看一下。
17:14
我来导入一个批处理场景,那我怎么知道批处理场景用的是哪个场景启动器呢?那按照它一般的命名,官方命名呢,都叫spring boot starter什么,那我就start本啊,批处理场景引入进来,我们再来看一下批处理场景里边的东西还还会不会发红走。来稍等一下批处理场景,我们肯定要下载所有的这个依赖,我来等一下啊。来等待他的这个下载,只要他这一块下载完了,我们这一块呢,就没有任何问题,我们来稍等一下。它在这呢,还在下载来解析我们这个依赖,好,它下载完我们来刷新一下,我们最好把这刷新一下。好,我们发现呢,它这一块就不发红了,那不发红呢,按照我们这个最简单的理解,那就是它生效了,但是为什么会发红,为什么会不发红,后来再说,所以呢,这就是我们说的,只要我们引入的这些场景,我们引入了这些自动配置才会开启,虽然写了这么多类,但这些类呢,不一定全部都生效,好我们把这个呢就放在这儿,这就是我们说的自动配置也是按需加载,那我们后来呢,再去来真正研究我们这个自动配置的原理,想要懂得自动配置原理,下边的这些东西我们都得学会,学会了以后呢,我们才能懂得我们整个自动配置的原理过程。
我来说两句