Springboot静态资源配置原理
在springboot定义中,我们只要把想访问的静态资源放在类路径下:called /static (or /public or /resources or /META-INF/resources就可以根据 当前项目根路径/ + 静态资源名进行访问,如图所示(此处只演示了一种):
那springboot是如何做到的呢?分析如下:
前期准备
- 当springboot启动时,会默认加载非常多的xxxAutoConfiguration 类(自动配置类),所以和web有关的自动配置类也会加载进去。于是我们便在下图的层次下找到和web有关的配置。
- 进入此类,查看它为容器中配了什么。通过源码我们可以看到它为容器中配的有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构造器,便可得知其原理。
不同的版本,源码可能发生变化,思路大致相同可以借鉴分析。如有错误,小伙伴们可以提醒下,谢谢!