Springboot静态资源配置原理

在springboot定义中,我们只要把想访问的静态资源放在类路径下:called /static (or /public or /resources or /META-INF/resources就可以根据 当前项目根路径/ + 静态资源名进行访问,如图所示(此处只演示了一种):
在这里插入图片描述
在这里插入图片描述
那springboot是如何做到的呢?分析如下:

前期准备

  1. 当springboot启动时,会默认加载非常多的xxxAutoConfiguration 类(自动配置类),所以和web有关的自动配置类也会加载进去。于是我们便在下图的层次下找到和web有关的配置。在这里插入图片描述

在这里插入图片描述

  1. 进入此类,查看它为容器中配了什么。通过源码我们可以看到它为容器中配的有HiddenHttpMethodFilter,它可以兼容Rest风格,使得表单可以提交put,delete请求。还有FormContentFilter,表单内容过滤器,我们暂时都不用管!
    在这里插入图片描述
    在这里插入图片描述
    接下来往下浏览源码,我们会发现有个名为WebMvcAutoConfigurationAdapter的静态内部类,它也是个配置类,借助构造器,从容器中拿到对应参数的值。
    在这里插入图片描述
    我们分析此处有个注解@EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class, WebProperties.class})作用就是把配置文件的相关属性和对应的组件进行绑定(spring.mvc,spring.resources,spring.web)。内部的大多代码我们都跳过,直接跳到和资源处理有关的地方。方法名为:addResourceHandlers。

注册规则—— 资源处理的默认规则

在这里插入图片描述

首先,它要拿到resourceProperties.isAddMappings()的值,一路追踪源码,默认为true,进入else区。看到代码第287行,此处的作用就是为registry访问规则里面注册第一种访问规则——"/webjars/**",当你访问/webjars/**下的所有请求,都给你找"classpath:/META-INF/resources/webjars/"这个路径。有兴趣的小伙伴可以自己去试下哦,此处就不试了。比如:访问jquery的webjars包里的jquery.min.js文件。如果我们在配置文件中把add-mappings值改为false,如图所示,则会进入if区,禁用所有静态资源规则。
在这里插入图片描述

接下来的一行代码就是注册静态资源路径的规则了,当我们没有配置spring.mvc.static-path-pattern的值时,this.mvcProperties.getStaticPathPattern()的默认值跟踪源码可知为/**。接下来的思路和第一种注册访问规则大同小异,只不过这次为我们寻找的路径变成了——this.resourceProperties.getStaticLocations(),跟踪源码得知,这次为我们寻找的路径为——“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”,这就解释了本文刚开始所说的静态资源的默认四个位置。

接下来还有个欢迎页的处理规则,大家有兴趣的可以自己去单独研究分析下。进入WelcomePageHandlerMapping构造器,便可得知其原理。在这里插入图片描述
在这里插入图片描述

不同的版本,源码可能发生变化,思路大致相同可以借鉴分析。如有错误,小伙伴们可以提醒下,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值