SpringMVC 内容使用 springboot 的自动配置来讲解 演示版本:SpringBoot 2.1.5.RELEASE
一、SpringBoot 默认访问静态资源路径
SpringBoot 集成 Spring MVC 后默认支持以下几种静态资源路径访问
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
下面通过简单的案例来验证这些路径静态资源的访问,
首先创建响应的静态资源路径,同时创建不同名称的 html 文件,如下图:
浏览器请求链接,请求结果如下图:
通过请求结果,能够验证这几个静态资源的有效性。
那么当这几个资源路径中存在相同名称的 html 文件时,也就是请求的 API 地址一样时,以哪个路径下的html文件为主?
相同名称静态资源在不同静态目录下的访问优先级为: /META-INF/resources > resources > static > public
二、从源码角度看问题
首先找到 springBoot 关于SpringMvc 的自动配置类 WebMvcAutoConfigurationAdapter
相关代码如下:
从上述代码能够知道两个点:
1、为什么所有静态资源不需要访问前缀,直接根据资源文件路径直接访问静态资源
2、springBoot 为什么静态资源路径默认为:classpath:/META-INF/resources/
,classpath:/resources/
,classpath:/static/
,’classpath:/public/‘,因为代码就是这样定义的。
2.1 为什么相同静态资源的加载顺序是:/META-INF/resources > resources > static > public
因为 springBoot 静态资源定义的顺序就是:classpath:/META-INF/resources/
,classpath:/resources/
,classpath:/static/
,’classpath:/public/‘ 所以按照顺序来执行
下面通过源码的方式来验证该观点,
首先回顾 WebMvcAutoConfigurationAdapter
自动配置类中,在组合静态路径配置后生成的对象
如图:
静态资源路径以字段属性的方式被组合进 ResourceHttpRequestHandler
中,以常量方式与该对象中。
根据 ResourceHttpRequestHandler
回顾一下 SpringMvc 的运行流程图
如下图:
如图中所示,springMvc 的步骤三,会根据 url 匹配到的 HandlerMapping 中的 Handler 执行操作,然后返回结果
根据 SpringMvc 来看一下整个执行逻辑
以 DispatcherServlet#doDispatch
为入口进行调试追踪
测试数据,以上面的案例进行测试,例如:
http://localhost:9527/meta-info-resources.html
相关的执行流程如下图:
通过执行流程能够了解到,静态资源加载的顺序,取决于你在进行你定义的顺序,更直白的说,取决于代码顺序,如下图: