品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
有很多小伙伴做Spring Boot项目的时候,在做静态资源加载时,都踩过坑。经常会会在项目中存放图片、网页、前端打包产物等静态资源。结果放的目录不对,访问的时候不是404就是加载了旧文件,排查半天才发现是资源目录优先级的问题,Spring Boot存在固定加载优先级,不熟悉规则很容易出现资源访问异常。还有个问题也经常被提到的是Spring Boot项目跑起来到底用没用Tomcat,很多人写了半天代码都没搞明白背后跑的到底是什么容器。下面给大家介绍一下Spring Boot会优先返回哪些目录下的资源,Spring Boot会用到Tomcat吗的相关内容。
一、Spring Boot会优先返回哪些目录下的资源
Spring Boot对静态资源的加载路径是有默认约定的,我们在项目里常见的几个目录例如classpath下的/static、/public、/resources、/META-INF/resources,这四个目录都会被自动扫描,不用我们去做额外配置就能直接通过路径访问里面的文件。

这四个目录是有优先级顺序的,我们按照加载先后来说,先是/META-INF/resources,然后是/resources,再接着/static,最后才是/public。也就是说如果同名文件在多个目录下都存在,Spring Boot会优先返回优先级更高的那个,这一点有很多人经常忽略,有时候改了/static内文件却依旧加载旧资源,往往是更高优先级目录存在同名文件产生覆盖。

我们在平时开发中用得更多的还是/static和/public这两个目录,前端打包出来的html、css、js文件基本都往/static目录里放,这也是Spring Boot官方推荐的做法。/public目录用得少,功能上和/static没有本质区别,更多是给我们开发者一个额外的组织选择。/META-INF/resources这个目录用得就更少了,一般是打包成jar给别的项目依赖引用的时候才会用到。

二、Spring Boot会用到Tomcat吗
有很多人不知道Spring Boot会不会用到Tomcat,其实我们Spring Boot项目里只要引入了spring-boot-starter-web这个依赖,内部就已经自带了Tomcat,不用像以前写传统Java Web项目那样,自己下载Tomcat再把打包好的war扔进webapps目录里部署。这也是Spring Boot被称为“开箱即用”的一个重要原因,内嵌容器把部署这一步大大简化了。

spring-boot-starter-web依赖里传递引入了spring-boot-starter-tomcat,这个starter把Tomcat的核心库打包了进来,项目启动的时候会自动创建一个内嵌的Tomcat实例,监听配置好的端口,项目打成jar包直接用java -jar命令跑起来就行,我们不用单独部署容器,对于开发调试和运维部署都方便不少。

有人要问Tomcat是不是唯一选择?并不是,Spring Boot支持替换成别的内嵌容器,常见的有Jetty和Undertow,只要在依赖里把spring-boot-starter-tomcat排除掉,换成对应的starter就能切换,配置起来也很简单。平时我们在项目里如果没有特殊性能需求,用默认的Tomcat基本够用,不用特意去折腾切换容器这件事。

以上就是Spring Boot会优先返回哪些目录下的资源,Spring Boot会用到Tomcat吗的全部内容了。我们在碰到静态资源加载的时候,要记住/META-INF/resources、/resources、/static、/public这个优先级顺序,同名文件覆盖的问题排查起来才不至于摸不着头脑。在Spring Boot中默认内嵌的就是Tomcat,靠spring-boot-starter-web依赖自动引入,不用单独部署,想换Jetty或者Undertow也有现成的路子,这些都是我们项目里经常遇到的问题,平时多留意配置和依赖关系,出问题的时候才能少走弯路。