00:00
好,那前面呢,我们说了一下静态资源的一些处理规则,那接下来呢,我们就来说静态资源的相关配置原理,来深入到底层,实先呢,所有的原理,我们起步的第一步应该是这样子的,我们这个spring boot启动,Spring boot启动它呢,会默认加载非常多的叉叉,叉叉,我们什么啊,Auto configuration con。格R这些类,我们这些类呢,就是我们说的这个自动配置类,那既然加载这些自动配置类了,那我们自然而然就应该加在我们跟web开发有关的相关自动配置类,那跟我们这个web开发里边,特别是我们现在要研究静态资源的一些规则,我们来到这儿来参照一下,所有的自动配置类都在这个包下,我们来找web场景。那web场景来来到so开发里边,其他的我们不用看,比如我们这个dispaure so auto configuration,一听这个自动配置类,那就是来配我们spring l VC里面dispa规则的,然后呢,还有htp including auto comp配置编解码的这个multi part,这是配置文件上传的server web啊,我们这个web server,这都是配置服务器的,好像我们这个静态资源跟服务器还稍微有有那么点关系,主要呢,我们这有一个叫web mvc auto configuration,那这个东西呢,翻译过来才是spring mvc的自动配置,所以呢,我们在后来包括我们要看所有MVC功能的时候,我们spring mvc功能的自动配置类大多呢,集中在这spring web mvc auto configuration,但还有其他的自动配置合起来才能完成我们完整完整功能,我们先来看它,在web mvc auto configuration,我们找到了这个自动配置类以后一定要看是否生效。
01:48
这个配置类生效,这个配置类生效,那怎么生效呢?你就得看我们的前面标的这一串,Condition呢,On web application,它呢是典型的sole web应用没问题,而且conditional on class类路径里边,我们现在有sole这个类,也有dispature sole类,那sol呢,就是我们原生的web开发,Dispal web confi,这都是你导了spring m VC的包,那自然就会有这个web con,好,那我们这一类也有,还有一个叫conditional啊,Missing be,就是容器中没有这个类型的组件的时候,我们下边的才生效,意思就是容器中如果有这个类型的组件,我们下边所有的配置都不生效,所以这其实就牵扯到我们后来说的要全面的接管spring m VC,我们全部对它定制化配置,那它下边的所有自动配置都不生效,所以呢,在这儿看,我们看到了这个特点,这个呢,我们留在后来再说,我们现在呢这个。
02:49
呃,生效了,生效了,那接下来的步骤呢,就是我们生效了以后,我们看它给容器中放了什么啊,给容器中配了什么,给我们这个容器中,给容器中配了什么,那配了什么自自然就有什么功能,就就是OK的,然后呢,我们来看一下配了什么,配了什么呢,我们就来主要来看一下,呃,配了这些,首先呢是一个hidden http method filter,哎,这个filter呢,大家都知道,这是我们spring mvc,用来兼容我们这个risk啊,分格的啊,我们表单可以提交put啦,Delete之类的请求,我们不用管,还有我们这个呃,Form content filter啊,我们表达内容的过滤器也不用管,暂时跟我们研究的没关系,这还有一个静态方法,我们先不管。然后呢,接下来这有一个public static class,我们这有一个静态的这个内部类,这个内部类呢,它还是一个叫configuration配置类,那既然是配置类,那接下来我们就。
03:49
再来看它给容器中干了什么活,相当于呢,容器中有一个叫web mvc confi这个组件,而大家一定注意,我们再来研究自动配置的时候呢,一定要看这个玩意儿,就是enable configuration properties,我们如果经常见到这些玩意儿,说明我们接下来呢会把我们这个配置文件。
04:10
里边的好多东西跟某一些呃这个类进行绑定,主要呢,现在看配了什么,然后呢,接下来我们核心的这一步就是呢,配置文件,配置文件呃的相关属性,相关属性和什么进行了绑定,我们看到呢,配置文件相关的属性主要呢,它在这有一个叫web mvc properties和resources properties,哎,那这两个呢,我们来先来分析它这web mvc properties,它是跟配置文件MVC前缀相关的进行绑定。那么在这呢,啊画上对等号,然后呢,我们的resources properties它呢是跟谁进行了绑定,来看一下resources properties它是跟resources下面的一些属性来进行了绑定,然后呢,我们知道了配置文件跟相关的属性进行绑定了,那接下来我们继续分析自动配置,那自动配置呢,接下来它就要给容器中干一些活,而且大家会发现这个类它呢只有一个有参构造器,所以我们说以后呢,一个配置类如果只有一个有参构造器。
05:23
大家在这呢,注意一个配置类,我们在这儿来作为一个扩展知识吧。这作为一个扩展知识,1234好,咱们这个配置类,呃,只有咱们这个一个用餐构造器,就像我们这种,如果我们这个配置类只有一个有参构造器,那它会带来什么特器就是有参构造器里边所有这个参数的值都会默认从容器中找有参构造器有参。构造器所有参数的值都会从容器中确定,那我们就来看一下我们的这个web mvc自动配置的这个东西,它要确定哪些参数,第一个叫resources properties,我们来分析一下它要确定的这些参数,Resources properties,那不就是绑定了resources配置文件里边所有东西的这个属性吗?而且我们之前用enable已经开启了,它确定就是在容器中,所以呢,这是啊,这是我们这个获取。
06:35
过去我们这个相当于和resources。和spring resources绑定的所有的值这个对象,然后呢,这是第一个第二个,第二个呢,他又要了一个web mvc properties这个东西呢,相当于它是来获取绑定了spring mvc的所有对象,所以呢,这两个没得说,我们只要跟配置文件进行了绑定,而且我们是用enable。
07:04
开启了这个绑定功能,我们说这个enable,它两个功能,一个呢跟配置文件,我们按照它们里边指定的规则绑定好,第二个干嘛把它们还要导在容器中,所以呢,我们这个有参构造器,这两个参数肯定能找到,第三个list Apple being factory,这个呢,相当于是找到IOC,这是我们容器工厂啊,这就是我们的工厂,这就是相当于找我们的spring容器,Spring的B工厂啊,就是我们的这个容器,然后呢,再接下来他要找到一个,这是object provide,我们这个对象提供器叫HD converts,这是什么?这是找到所有系统里边找到所有,找到所有的HT message,哎,我们后来会说message converter,大家都知道,这些东西呢,是从容器中找就行了,找到这个。这个叫resource handler registration custom,相当于找到我们这个资源处理器的自定义器,资源处理器的自定义器,那么一会呢,又会把这个我们要着重说一下啊,因为我们现在就是要说跟资源处理相关的,然后呢,这有一个这个东西,然后呢,他又找dispature so pass,相当于我们这个dispature so能处理的这个路径,这些暂时跟我们这一块没关系的,还有一个so registry being,这是我们后来说给我们这个,呃,给我们应用注册。
08:38
应用注册原生的,比如serveet啦,Filter啦,Listener啦,这些东西的时候我们用的,后来再说好,所以呢,跟我们相关的,这有一个custom,我们后来再说,这是我们看到的,我们现在呢,这个配置类已经把所有的东西从容器中自个儿拿到了,拿到了以后呢,接下来我们来看它干嘛?首先呢,它配message converter对吧,把我们相当于容器中所有的message converter拿过来,拿过来给你放进去,这些我们都不用管,我们主要看跟资源处理有关的,一直往下翻。
09:17
然后呢,它还给容器中加internal resource view reserve试图解析器,我们在试图解析章节再说,而且呢,每一种加的规则都是conditional missing being,你不配了人家加,你配了人家就不加。然后呢,接下来这些我们都不用管,都不用管,这都是加视图解析器,Local reserver,加国际化支持的,不用管message code的,这都是国际化的,这些消息解析的我们不用管form,这是格式化器,也就是我们一般用来格式化货币啦,我们日期啦,我们也不用管,主要在这resource handle添加我们这个资源处理器,来吧,我们把这一段核心代码拿过,所以呢,所有的资源处理默认规则就在这儿。
10:00
资源处理的默认规则。这个默认规则呢,在这儿我可以来打上断点,我们来看一下它的这个默认规则,它是怎么起作用的,因为它呢是一个配置类,肯定容器一启动,你都不用发请求,他就要把这些东西呢都给我们来做好。来稍等一下,好,现在呢,我们来看它呢,先获取this pro resource properties is and mapping resource properties大家都知道了,这是啥玩意儿,我们在构造器的时候是从容器中拿,相当于呢,他拿到了spring resource这个配置文件下绑定的所有配置的东西,所以呢,我们现在来看到这,他呢先拿到第一个属性resource properties里边的is and mapping,相当于呢,我们resource properties跟配置文件绑定,还能有一个这个属性叫and mapping,这是干什么的?正好我们来看一下啊,Resource里边还能有一个叫and mapping true还是false,默认的是true,默认是处,我们来看它是啥效果,他呢在这判断,如果是true,如果是处,那非处就是false,这个F就进不去,那如果是false,它能就能进去,所以呢,如果我配成false了,下边所有的配置不生效,大家一看下边这个配置就是配置web JA请求访问的时候去哪找,哎,怎么。
11:24
对,所以呢,静态资源规则的配置在这儿,但是呢,我们可以禁用掉静态资源的路径映射,所以我可以完全在这儿来整一个force,一整一个force以后,所有的静态资源配置啊,都等于零,那一等于零以后呢,我们所有的静态资源相当于都访问不了,你放哪儿都访不了,因为静态资源能访问规则都在这儿,我们现在配成force以后,大家看进来了,进来了控制台就会给你打印静态资源呢,已经被禁用掉了,所以我们来看控制台打印,控制台的这个日志有没有打印静态资源被禁用,哎,人家是debug日志级别比较低,我们现在打印不出来,但是呢,最终的效果就是我如果把它放行,我们现在要访问项目里边的所有静态资源,那原来这个支付宝能访来刷新,现在就是404,所以呢,我们通过这个我们发现哦,原来这样呢,也可以来禁用掉静态资源。
12:17
CTRLC。这个默认规则来,我们默认规则里边我们发现的第一个好玩的在这,我们呢,可以通过配置这个and map等于false,然后呢,即直接禁用掉所有静态资源,静禁用所有静态资源规则,这样呢,我们的静态资源你不管咋放都访问不了,我们不用管了,所以呢,我们就让它静态资源能访问,能访问呢,我们把它打成处。打成处以后呢,我们来看它怎么配好的静态资源规则。静态规自然规则呢,也挺方便来看一下。我们现在呢,是处非处呢就是false,我们来进入到配置,而且呢,静态资源它还能从这个resource properties里边,而这个properties又是跟spring的那些绑定的,它还能获取到我们这个缓存策略,所以相当于我们能看到,哎我们静态资源呢,可以配缓存,比如我来配缓存,我们缓存的时间有多长,11000,哎这个缓存的这个时间是什么东西呢?我们点进来一看,诶,它是以秒为单位的,意思就是我们所有的静态资源默认可以存多少秒,哎,我现在配了一个1100,你就能拿到这个1100的这个秒值啊,以后呢,我们浏览器就会把这个静态资源给我们默认存这么长时间啊,这么长时间以的这个资源呢,我们都不用去访问了,可以大家看好,这就是我们缓存最终的这个1100没问题,然后呢,再来接下来他拿到我们这个缓存的这个控制啊,我们静态资源能缓存,接下来看他给我们这个registry想访问规则里边开始注册,注册第一种访问规则叫。
13:59
Web杠双星,然后呢,你访问web JA下边的所有请求,然后怎么着呢,它开始给你注册web JA下边的所有请求,都给你找这个路径,And resource locations,哪个路径就Meta INF for resource web,这就反映了我们为什么之前导入解克瑞的时候,解克瑞的这个web JA这个包,我们呢,只需要访问的这个资源是什么?
14:24
我们现在把它一放行一下,我们呢,只需要访问的资源是这个。叫web。来我们解开这个就能访问,因为呢,我们整整个请求的全缀是web JA杠双星,然后呢,Web JA下面的所有东西会在Meta Meta info resources web JA下面找,所以这是类路径,Meta info resources web JA下边,所以呢后边你跟的是什么,它就把这个东西就按照你的曾经路径找在这儿,杰克瑞315这儿,所以呢,所有的东西啊,他其实在这放着,而且这个资源呢,还会缓存一段时间,缓存多久呢?按照你之前设置的这个缓存,也就是说我只要访问过一次以后,我来F12,我们可以给大家看到的一个效果就是好,我们把这个缓存呢,不禁用我来刷新我们来访问的这个资源,大家会看我们的这个资源,我再来刷新访问一次,我们的这个资源呢,它就不是实时访问了,304304的这个东西呢,我们来可以看一下啊,它是不是from catch。
15:28
诶,这有个catch ctrl,好,我们的这个缓存控制1100想告诉浏览器,你自己呢,给我缓存这么长时间以后呢,就别真正的访问我们的这个请求了,好,我们这个缓存呢,也能自己来配置生效,包括我们在下边我再来debug,这只是我们web adjust的相关规则,其实在这我们就发现了。这一步呢,是web jas的规则,Web jas的规则,然后呢,再来往下,再来往下,再来往下呢,大家会发现我们在这儿呢,开始来进入到静态资源路径的这个配置规则,那么项目一启动,加载这个配置的时候。
16:08
首先获取static pass pattern static pass呢在mvc properties里边。我直接放行到这,而mvc properties呢,它是又是跟配置文件绑定的,叫spring.MVC虽然我们配了spring.MVC然后呢,Static pass pattern,我们只要配了,那接下来它就会获取到这个值,没配也有默认值,我们来看,现在我们没配,默认值是杠双星,对吧?然后呢,杠双星下的所有请求怎么办呢?然后它跟之前一样,大家看啊,这两个呢,其实调用的是一模一样的方法,只不过呢,人家映射的是web JA下面的所有请求,而我们映射的是杠双星下边的,然后呢,Web JA下边的请求是在这个下边找的,而杠双星呢,是get resource location,它是在我们指定的位置找的,指定的位置在哪?指在resource properties static location里边,这个static location呢,其实它有默认值,默认值在这。
17:06
一个位置,两个位置,三个位置,四个位置,哎,这就解释了我们为什么静态资源路径默认的四个位置。我们把这四个位置呢,给大家拿拿过来,大家能看到这默认的四个位置,但是如果我们一旦改了这个默认的这四个位置,那就按照我们改了的来,它最终呢,相当于我们杠双星下的所有请求在我们的这四个位置拿,而且呢,也有缓存策略,静态资源都有缓存策略,这就是我们这个静态资源,它在这一块的整个配置。包括呢,我们欢迎页,我们也可以来看一下,我们能不能找到欢迎页呢,来往下翻。我们往下翻呢,我们发现还有一个配置类对吧,那么之前呢,有一个这儿还有一个我们一直往下翻,它给容器中按,并放好多东西,然后呢,大家注意在这呢,会放一个叫welcome page handler map。
18:03
CC,这是欢迎的规则。它在这。欢迎页的处理规则的处理规则他呢,在这儿在这儿首先呢,我们应该明确的一点,就是我们来看源码之前,大家得知道一个东西叫handler mapping handler mapping呢是我们spring l VC里边一个核心组件,你翻译过来就叫处理器映射,它里边呢保存了,保存了每一个handleler,每一个handleler,每一个handle了能处理哪些请求,能处理哪些请求,所以呢,你请求一过来以后,我们handle拉mapping里边看哪个请求谁处理,哪个请求谁处理,哪个请求谁处理,找到了以后呢,就给你利用反射调用那个能处理的方法,而呢,它给容器中放了一个叫welcome page camera德门,相当于呢,我们欢营业谁能处理的这个请求映射规则,来看一下这个映射规则是什么,我现在给这儿又打了一个断定。
19:09
同样的,大家能看到at being给容器中放东西,放东西以后呢,At being的这个方法呢,又又有很多的这个传参,这个参数一定都会从容器中拿,所以呢,他已经从容器中把这些都拿好了,我们不用管,然后呢,他开始new一个welcome page handler map new的时候呢,传了一堆参数,其中就有一个mvc properties static。Pass pattern,也就是说我们之前在丫面里边配的啥static pass pattern,就是这个,所以呢,我们这个欢迎页,他在这儿拗的时候,哎,我们不妨进入到他的这个拗里边吧,拗里边我们给这儿打一个断点,我们放行到我们看他拗,他给我们传的这几个。我们自己配的这个静态资源路径,哎,这静态资源路径是杠双芯好没问题,这我们主要要看这个welcome page好,Welcome page呢,他说现在呢是是空的,哎没有找到,我换一页没找到吗。
20:10
来看一下我们的这个雅美尔配置,好,我们呢是在哈哈下的啊,我们再来到他这儿啊,我们现在来看一个东西,它欢音页is present,如果欢迎页存在,并且呢,杠双星是你的这个访问路径,也就是说现在问题就是如果我们配置了自定义访问路径的前缀,那我们这个就进不来,所以呢,欢迎页,哎,这也解释了我们为什么欢迎页我们有自定义访问路径前,我们的这个欢迎页就找不到了,哎,原来它是在底层写死的,这中间我们一点办法都没,所以呢,这是我们这个换页的配置,也比较好玩嘛,也就是说,哎,这是我们能看到它的这个构造器,在构造这个handleler mapping的时候就写死了。那写死了我们自然我们如果要不不按照人家指定的配,那没办法,所以呢,我们这个静态资源路径要要启用,要用欢迎叶功能,欢迎燕功能,功能必须是咱们这个杠双星,然后呢,当然你不是杠双星,它就变成另外一种了,就是说呢,你的这个模板还存在,那我们现在呢,就是杠双星,所以呢,它的这个F我们来看一下啊,我们这个杠双星它这个if没进去,没进去是因为我们的的这个index year不在了嘛,然我们把哈哈里边的in this year给它搞掉了,然后呢,我们把这个index页如果放到这儿。
21:39
我们来看一下,来重新debug启动。就是呢,它一启动这些规则,它就提前已经配置好了,因为它是一个配置类,好配置类呢,在这拗这个构造器的时候,我们来判判断这个换页存不存在,我们现在呢,肯定要存在了,来进进去。
22:00
来看一下它的这个存不存在,关于一件存不存在。计算一下,哎,他说欢境页不存在吗?我们这个欢迎页在哈哈下边应该是有的,他他没判断对,这可能是我们这个idea启动有问题,然呢,你这个欢迎页如果是,呃,如果是存在,并且呢是杠双芯,那我们就给你转到欢迎页,否则呢,否则它是来就是你换一页,如果存在就给你转到这个index,但是它整个判断我们现在不存在,不存在我们不管了啊,刚放进去,刚放进去我把这个停了,停了再得8UG起一下。这下就应该存在了。所以人家在这一块是写死的,呃,我们没啥办法。来,走。还是不存在,是因为我们把这个静态资源关了吗?哎,这个静态资源按照门是开的啊,算了我们不管了啊,那现在呢,就是我们这个换页的逻辑呢,就是在这儿。
23:02
我只要换一页存在是杠双星我们就OK,否则的话呢,它是给你直接设置了一个5u name,相当于呢,它是调用咱们最终controller,看谁能处理这个杠index请求的,这是我们这个欢迎页,包括我们这个fair icon这个东西,这个东西呢,其实跟我们这个代码就没关系了,Favorite icon,因为这是我们这个浏览器都会默认发我们这个当前项目下的咱们这个icon功能,所以呢,一旦我们配置了静态资源的访问前缀,你的这个访问路径已经不在当前项目下了,你还得加前缀了,那自然找不到。这是我们说的整个静态资源的配置原理,我们也看到了静态资源默认规则的出处,包括呢,为什么我们感觉一加前缀就有问题的bug啊,就在这儿。
我来说两句