springboot 资源resource文件加载优先级

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路springboot 资源resource文件加载优先级,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1.问题

在通过spring项目官网生成的springboot
project项目中,通常我们知道,resource目录是存放项目的静态资源的目录,如在很久以前,项目开发没有采用前后端分离的时候,那么大量的js文件和html都将放到resource目录。
但是我们可以看到,这个自动生成的目录中有个static目录:
image.png

这不仅引起了我的好奇,什么情况下的文件需要放置道static目录?

2.springboot的资源目录优先级

这一查询不要紧,原来与springboot配置文件加载的目录类似,resources文件同样也可以放置在多个目录,但是具有不同的优先级。
resources支持的目录如下:

classpath:/public/
classpath:/resources/
classpath:/static/
classpath:/META-INF/resources/

  
  
  • 1
  • 2
  • 3
  • 4

我们知道resources目录在默认情况下编译之后会直接将资源放置到jar文件中,即classpath。那么我们分别在这些目录中配置相同的文件,1.html,其内容分别对应为其所在的目录。
image.png

我们访问http://127.0.0.1:8084/1.html,可以看到其结果:
image.png

classpath:/META-INF/resources/目录的静态资源文件具有最高的优先级。那么我们将这个目录中的1.html删除,再次访问:
image.png

现在访问到的是classpath:/resources/目录中的资源文件,我们将resources中的文件删除。再次访问:
image.png

现在访问到的是classpath:/static/目录中的资源文件,我们将static中的文件删除。再次访问:
image.png

最后才是classpath:/public目录的文件。

因此得到上述资源路径的优先级为:

目录 优先级
classpath:/META-INF/resources/ 最高
classpath:/resources/ 其次
classpath:/static/ 第三
classpath:/public/ 最低

可见,spring官网创建的目录static,默认是第三优先级的。
我们可以在这些资源目录中放置我们所需的静态资源,这些资源都可以在tomcat启动之后在浏览器访问的url下面访问到。

3.相关源码

查看springboot源码,基于springboot 2.4.2的源码:
在WebMvcAutoConfiguration类中有一个方法:

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
	super.addResourceHandlers(registry);
	if (!this.resourceProperties.isAddMappings()) {
		logger.debug("Default resource handling disabled");
		return;
	}
	ServletContext servletContext = getServletContext();
	addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
	addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
		registration.addResourceLocations(this.resourceProperties.getStaticLocations());
		if (servletContext != null) {
			registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
		}
	});
}

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

可以看到,这个类首先会判断resourceProperties有没有被修改,也就是说,我们有没有自定义配置文件的加载顺序,如果没有被修改,那么会通过默认配置来实现,也就是上文中的顺序。
而在webProperities类中。
内部类Resources可以看到这个顺序:

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
		"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
  • 1
  • 2
  • 3

CLASSPATH_RESOURCE_LOCATIONS树组即为我们定义的顺序,这个树组的顺序和前面我们测试的结果一致。

3. webjars

另外,在看前面代码的过程中,发现了一个有趣的webjars。

	addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");

 
 
  • 1

webjars是什么呢?
我们可以看其官网:
https://www.webjars.org/
这是一个将前端资源变成jar包的工具库。这样一来可以将前端的各种依赖都通过maven进行管理。
image.png

其支持各种前端类库。
image.png

我们以jquery为例,在build.gradle中加入:

	compile 'org.webjars:jquery:3.5.1'

 
 
  • 1

可以看到,前端资源就这样被gradle当作jar包加载进来了。
image.png

我们可以访问:
http://127.0.0.1:8084/webjars/jquery/3.5.1/jquery.js
就能请求到jquery的js文件了。
image.png

这样我们可以理解,实际上META-INFO.resources是专门用来给前端资源文件使用的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157350.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!