00:00
我们来说第11小节,定制化原理,这小节呢,我们主要来做一个总结,也就通过前面我们对web开发场景的整个源码分析,我们发现了一些web开发里边的自动配置原理,以及我们web开发里边一些重要的组件的工作流程,而且呢,我们也发现了一个SW boot底层的一个套路,首先默认情况下我们spring boot是完全工作良好的,因为所有东西都得益于它一个叫自动配置,而整个自动配置的套路呢,就是这样,我们首先指导了一个web场景的这个启动器starter,而这个启动器呢,会给我们引入一系列的叉叉叉,Auto configuration,有什么什么东西的自动配置,而这些自动配置呢,我们一般都会在这自动配置类里边看到,它会使用ant being等给我们这个容器中导入一些组件,而且导组件的时候呢,组件的一些默认属性都会跟我们的什么什么properties来进行绑定,这个properties。
01:01
那最终又绑定的是一个配置文件,所以呢,我们这个呢,它又是绑定我们这个配置文件项,所以按照默认情况,我们无需做任何的修改,我们spring boot呢都能完美工作,而且呢,如果我们想要修改,那按照默认情况,我们只需要修改配置文件就行了,所以呢,中途的这一块呢,都是spring boot给我们的一个封装操作,那么我们可以无需管,以后我们使用spring BOO开发,只需要导场景启动器,然后呢再来修改配置文件,但是如果我们在未来开发的过程中,我们真的想要深入定制化,我们要该怎么做?那按照我们前面的这些源码分析,我们大概总结了一下定制化的几种常见方式,首先第一种方式,我们使用ant be应的方式,我给容器中来添加组件,这样呢,我们这种方式呢,一般是来配合我们把第一个呢跟第三条来合起来,一般是呢,配合我们写的这个自定义配置类比,就说呢,我们知道spring boot底层呀。
02:01
它会自动配置很多东西,那我呢可以自己写一个配置类,我们因为我们发现它底层来at并给容器中注册的时候,会大量建到一些这铸件,比如at condition的啊,Missing being,然后容器中没有这些组件的时候,它呢才会给我们注册,有的时候就用我们的,所以呢,我们第一种方式,我们可以编写自定义的配置类,我们让这个配置类给我们at b给容器中多注册一些组件,而且注册的这些组件呢,有时是一个功能替换,有时是一个功能增加,比如举一个例子,我们以前呢注册过视图解析器,而我们注册的这些视图解析器呢,我们来看一下啊,我们以前呢,应该在前一个工程们来讲视图解析原理的时候,注册过视图解析器,而我们视图解析器呢,它其实是一个增加在众多视图解析器里边,诶我们来添加上一个我们想要的,那特别是呢,针对于我们这个,诶我们添加过我们在这个工程里边呢,你添加过我们的这个异常解析器。
03:01
这异常解析器我们给它放到容器中,你使用ant being放容器中,或者写一个类使用ant componentund放容器中,这个呢都是一个功能的增加,它呢spring boot底层会结合我们系统里边默认的这些异常解析器,再加上你自己给里边添的组件,它来一起生效,所以这是我们常见的第一种定制化方式,我们自己写配置类,自己给里边放组件。第二种定制化方式,那就是修改配置文件了,那这也是我们后来推荐经常要做的这一种方式,那第三种配置方式,那就是我们上一节课刚见到的一种模式,叫叉叉叉cost,那未来呢,我们在spring boot底层,我们会见到非常多的这些customer我们的定制化器,这定制化器呢,我们比如spring BOO官方文档给我们的这一段代码,这段代码呢,它就是用来我们来定制化,我们来可以看一下啊,从boot官方我们的在sol这个容器支持这一块我们。
04:01
当然定制化我们的web容器,我们也可以实现我们这个定制化器,然后呢,我们在这一块来修改我们web,呃,Server,我们服务器里边的一些参数配置下,所以呢我们也可以使用这种方式,以后未来大家见到这种方式了,这也是可以来进行定制化的一种方式。那另外就是我们最需要大家关注的,我们现在呢,在进行web应用开发,我们经常要对web应用做功能的扩展定制,我们的实现呢,就是使用这种方式,我们呢一般会来写一个配置类,这个配置类来实现web mvc computer这个接口,然后呢,在这个里边对我们的web整个来进行一个扩展,所以呢,我们推荐大家一定要学会这种方式,我们该如何定制web,那就是这么来做,那这种的定制方式呢,啊,我们直接把这个代码呢,大家弹过来吧。这种的定制方式呢,也是我们后来在web开发里边用的非常多的这种定制方式,另外我们来参照spring boot的官方文档在开发我们web应用,哎,我们来看官方文档说spring mvc底层给我们自动配置了非常多的规则,如果我们想要修改第一种方式就是我们写一个配置类,它来实现web m VC con接口就行了,那我们就是这种照做的。那第二种方式,如果你想要修改spring m VC非常底层的一些组件,比如它的handler和handler adapt,你可以给容器中来注入一个这个组件叫web mvc reg registrations,好,我们可以来这么来做,比如我们来给容器中放一个它,你可以写一个类放一个它,你也可以使用ant being的方式,给容器中放一个它来拗一个web mvc registrations,好,我们来把它拗过来,然后呢,我们来把它return出去。
05:57
然后呢,我们准备一个它有什么作用呢?我们点进来,我们发现呢,在它的底层我们可以实现一些,比如我们get request handler map这样的话呢,我们就相当于重写了来get request handle了map,相当我们自己呢重新定义了handle了maping的这个行为,但这个呢,太过底层的东西,如果大家呢,没有完全掌握spring m VC的hand德拉map品原理,那推荐还是不这么做,但是呢,这也是一种方式,我们可以修改,我们通过这个web mvc registrations来修改spring mvc底层的这个组线,然后另外一种就是spring官方说如果我们想take complete control,我们要完全控制我们的spring m VC,我们呢应该写一个配置类,这个配置类呢,标注enable web mvc注解就行了,那如果我们把我们的这个spring mv4这个配置类我来扩展一下,我来只需要加一个注解叫aable web m VC。
06:57
那呢,你一旦一把它一夹,我们它呢,就是我们完全控制spring m VC,也就是我们说的全面接管,所谓的全面接管是什么意思,我们可以给大家看一下,我不加他的时候,我们默认的静态资源啥都是能访问的,因为我们底层有静态资源的自动配置,但是如果我一旦把它一加,我来启动我们的项目。
07:23
来启动项目,来看一下我们的静态资源,我们举一个例子啊,以静态资源为例,我们看全面接管的情况下,我们这个静态资源还能不能用。我们想要访问静态资源,默认的这个静态资源呢,都在static目录下,我们直接访问就行了,比如我们想访问CSS不strip mean CSS就来访问,来访问它下边的,哎,我们的这个RI mean CSS回车,然我们发现呢,他来到这请先登录,那我们要访问的这个路径呢,在这儿我们访问的是CSS不命CSS发现呢是404 404的原因就是我们一旦要全面接管spring mvc静态资源,包括我们的之前的一些视图解析器,解析器,以及我们的这个呃解,还有欢迎页,欢迎页等等等等,所有的s boot官方所列举的它的这些自动配置,就是这一堆的这些自动配置呢,全部失效,全部失效,全部失效,那就必须我们自己来定义这个行为了,那比如我们来自己定义,我们来静态。
08:34
资源该怎么做,我们这个web mvc conve,正好呢,它里边有一个叫and resource handle,好,我们来把它点加上,这一块呢,我们就来定义静态资源,定义静态资源,定义静态资源行为,我们怎么定义呢?这有一个静态资源的这个注册中心,我们在这里里边有一个叫and resource handler,叫添加静态资源的这个处理这一块呢,会传一个静态资源的这个路径,比如我这个路径呢,我们传一个叫static下边的所有,也就是说你访问我static路径下边的所有,那默认给你挑到哪呢?我们点一个and resource locations,这叫资源的路径,这是资源的处理资源的路径,我们静态资源呢,都在类路径下的static这个文件夹下,所以我可以这么来写,叫class pass,内陆记下这都是spring夹的写法的static这个文件夹下,那我写的这句话的意思,那为两。
09:34
Study区分,我们给这写一个AA,那我的这一句话的意思就是访问AA路径下的所有请求,所有请求都去这个路径下来进行匹配,都去它下面进行匹配,所以这就是我们说的静态资源,我们定义了一个静态资源行为,那一旦我们现在这么一定义以后,我们来看此时的静态资源想要访问能不能访,当然可以,我们只需要访问AA下的所有它呢都会去我们这个静态资源目录下来找,比如我们来访问AA下的CSS下的不得strip me,那这样这样呢,它就会在静态资源目录下来找CSS不strip me来测测试一下啊,那么现在来想访问静态资源,我们来加一个前置路径AA,我们来看一下啊AA,我们来这种访问AA,我们发现呢,这确实已经访问到了,但是这还请先登录。
10:34
请先登录的原因是在这儿,是因为我们这个,我们这儿还有一个拦截器,拦截器呢,没有放行我们新的静态资源下的东西,那我们可以来让它放行一下杠AA下的所有,所以呢,也就是说我们如果全面接管了spring mvc,我们就一定要定义它底层的这些行为,那这些行为呢,全部都得定义好。
11:03
们来看一下,那此时再来刷新,好,现在这个静态资源就能访问了,所以呢,我就把这一块这一块这个注解呢,大家一定要慎用,我们这个enable spring m VC,它是可以来全面接管的,我们所有的规则呢,都需要自己全部重新配置,实现定制化,那为什么它能实现这么样的一个效果,我们也可以给大家来分析一下底层的原理,那因为我们以前来看一下啊,我们以前spring mvc的所有自动配置在这个类里边,叫web mvc auto configuration在这个里里边呢,给我们配了MVC的众多规则,比如我们这个静态资源的这个路径在下边,这还有我们这个异步的规则,消息的message convert来看啊,还有我们的视图解析记,以及我们这个内容协商管理器,包括我们来这一块的静态资源处理,所以呢,在我们这一块底层已经配了非常多spring m VC的功能。
12:04
来分析一下为什么能实现它这样的效果,它的这个原理是什么?它的原理呢,是首先它是默认的,默认的spring m VC spring m VC的自动配置功能,配置功能类在这个里边呢,我们有对静态资源,静态资源欢迎页视图解析器等等一堆的配置,欢迎页等等一堆的一堆的配置,而呢,我现在我现在呢,大家来看啊,我一旦使用了这个铸解,叫aable web mvc,一旦使用它,一旦使用这个注解,一旦使用这个注解,它会发生什么样的一件事,我们可以来看一下啊,A number web mvc这个注解,它呢是一个复合注解,它呢调用了import never这个注解啊,一旦使用它,然后呢。
13:04
Enable的这个MVC它呢会导入,会import导入一个这个东西,而这个东西是什么,它我们来看一下啊,我们把它点进去,它里边呢,也定义了一些默认行为,看这一块呢,比如我们静态资源的这个路径,这只不过呢,都是调用这些conig的,调用这些conig的,所以呢,我们相当于这些conig,其实不正是我们在这个类里边实现的这个接口嘛,所以如果我们想要全面定制spring mvc功能,我们只需要呢一个enable web mvc注解,加上呢,你容器中只要有这些菲,只要有这些web mvc con菲,它呢自动会拿进来,大家看owa这个类的作用,我们把这个类的作用给大家分析啊,它的作用是把所有系统中的这个东西加外。
14:04
把MVC康菲克这是一个集合,大家看啊,这是owa,所以呢,把系统中的它拿过来,系统中的它拿过来,拿过来以后呢,挨个进行生效,为什么叫挨个进行生效,大家看啊,Confis这里边呢,是相当于所有的这些web mvc康菲克,然后接下来呢,每一种配置就是所有的这些康菲克共同生效,所以呢,对于每一种配置的定制,比如我们这个呃,资源处理器的配置,所以呢,所有功能的定制,所有功能的定制都是这些con菲一起生效,比就说呢,Spring l VC,不管你把这个con菲写在了一个类中,还是呢,你有众多类都继承了实现了这个抗菲格,或者容器中有这些抗菲格,你无论有多少的抗菲格,它呢都会把这些功能合起来,都是这些合起来合。
15:04
起来一起生效的,所以呢,Spring m VC给我们的boot给我们的开放性很大,我们随便写就行,只要容器中有这个玩意儿,它呢就能让我们生效,那一旦让我们生效以后呢,我们来看,而且呢,它也有一些默认行为,因为它是继承这个的,这个里边呢,默认行为呢,就是其实它给容器中也放了一些,比如request handle m,比如说呢,其实我们never mvc这个东西呢,它会自动配置一些东西,比如是这个类的,这个类的,这个类呢,它也自动配置了一些,它只是自动配置了一些非常底层的组件,自动配置了一些,自动配置了它自动配置了一些非常底层的组件,比如我们看到。他给容器中放了request mapping,看到了mapping,而且呢,因为我们这个,呃,这个映射器,这个映射器呢,还有一些啊,这些内容协商管理器,他们都是从容器中拿的,所以呢,放了一些底层的组件,而这些组件依赖的组件,这些组件依赖的组件都是从容器中获取,都是从容器中获取,所以呢,还是那句话,Boot给我们提供的这个啊,开放性非常的大,我们随便写,只要容器中有这些玩意儿,它就能生效,我们的request mapping handle mapping,只要你容器中有内容协商管理器,它就拿过来就直接能生效。而底层呢,这个类底层也定义了非常多的东西,比如UR pass helper,还有我们的这个pass man等等等等,所以你说这个类没功能吧,它有功能,只是定义了一些非常底层的组件。然后呢,接下。
16:57
看来为什么我们静态资源就给失效了,关键核心就来了,所以呢,这个类只保证了我们spring mvc最基本的使用,它只保证只保证。
17:11
Spring mvc最基本的使用就是有核心组件就行,有request map map,有A,有这些组件就行,然后呢,最重要的就是我们以前呢,对spring mvc功能的自动化配置都在web mvc auto configuration里这个类里边,但大家一定注意啊,Web mvc auto con这个类它要在下边所有的自动配置生效,它的最核心在这有个叫condition的啊Miss b,所以呢,Web mvc auto configuration里边的配置,里边的配置要能生效,必须有一个条件注解,这个条件注解呢就叫condition的啊missin b,就是容器中没有这个组件的时候才生效,有了呢就不生效,大家看它是判断容器中没有哪个组件,这个组件叫web m VC抗。
18:11
Support这个组件是谁?是delegate web mvc,我们的这个configuration所继承的这个东西,所以大家一定看好他呢,我们来看啊,他的完整声明是这样子的。我们把他的这个完整声明拿过来。现在呢?大家来串一下就应该很清楚了,为什么我们一写aab web mvc这个注解,我们默认的配置就没用了,因为enable web MC给我们导了delegating web m configuration给容器中有了它,容器中有了它就相当于有了它。因为呢,它就是这个类型的,而容器中呢,一旦有了这个类型,那我们的web mvc configuration它就不生效了,因为它是condition,那啊,Miss being容器中没有它才生效了,所以容器中一旦有了,它就不生效了,所以。
19:14
Enable configuration,所以一句话就是enable web mvc导致了web mvc configu auto configuration没生效它。导致了,所以最终呢,导致了我们的这个web mvc configuration没生效,所以相当于一句话,Web mvc configuration没有生效,里边自动配置了什么,它一旦没有生效,它里边之前boot官方给我们自动配置的这个东西,你呀都得配,比如呢,没有我们的这个,呃,支持rest风格的过滤器,也没有下边一堆众多的message convert等等等等,所以好多东西呢,你全部都得给我们配上,所以这就是我们说的spring lvc底层的自动定制化原理,大家呢,最终只需要用到一个就行,就是我们以后想要定制外表的功能,一般都是我们来写一个配置类,我们让这个配置类呢,实现web应用编写一个配置类,然后呢,并实现web MC卡菲接口就行了。
20:26
然后呢,这个接口里边规定了我们能定义外边的所有功能,然后呢,包括我们也可以at b给容器中再放一些功能,再来加上你按特B给容器中,给容器中在扩展,在扩展一些组件,我们就足够我们的这个web开发的使用了,好那至此呢,我们整个web开发的场景我们就基本说完了,那我们希望呢,通过我们对web开发场景的整个源码的分析,那对我们整个web处理请求的原理有非常多的这个掌握,以后呢,我们整个web系统出现问题呢,我们想要debug走到哪一步有问题我都应该清楚,这样我们这个调试起来呢,就非常方便们写应用呢,也不会把自己套在里边,但通过对于我们这个章节的源码分析,我们相信大家已经对spring boot的核心精髓,有了非常多的这个,掌握了其实后边的所有的这些,比如我们该如何数据。
21:26
问,访问数据库,那大家一想就知道,那数据库肯定啥都自动配置好了,那么接下来只需要看配置文件里边需要写什么就行了,包括单元测试,那啥都是自动配置好的,我们来看单元测试该怎么做,包括指标监控也都是配置好的,甚至于我们的众多场景整合,Boot里边red该怎么整合,Re MQ怎么整合,卡夫卡怎么整合等等,其他各种都怎么整合,全部都是这个套路。你只需要引入这个场景的启动器,所有东西都自动配置好了,你只需要看一下你要不要改配置文件里边的哪几项,如果你觉得真的不满意了,你可以使用我们前面说的这几种方式修改配置文件,或者找有没有什么定制化器,或或者那自己写一个配置类按,并给容器中放一些组件,替他默认行为即可。这就是我们说的子布,它的整个精髓。
我来说两句