【SpringBoot】静态资源问题探究

一、分析源码

我们可以发现在我们创建的springboot应用中并没有类似于springmvc那样存在web目录

那么在springboot中的静态资源应该怎么存放,或者说静态资源的访问应该怎么实现呢?接下来,我们就会探究一下静态资源的引入问题


我们早创建springboot时,我们添加了Spring Web依赖,所以存在一个核心的类"WebMvcAutoConfiguration"类。

1、webjars

我们打开WebMvcAutoConfiguration类后,可以找到其中的一个方法addResourceHandlers方法,如下(代码01):

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

其中的存在的下面这个代码的意义大,它是一种webjars的静态资源处理方法(不推荐使用

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

2、resources

除此上述之外,我们可以注意到在下面还有一段类似的代码,如下(代码02):

addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (this.servletContext != null) {
					ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
					registration.addResourceLocations(resource);
				}
			});

其中有getStaticPathPattern()获取静态路径模式的方法,我们点开这个方法后,如下:

	public String getStaticPathPattern() {
		return this.staticPathPattern;
	}

接着点开staticPathPattern,发现是访问路径,意味值是访问静态资源的根目录。如下:

	/**
	 * Path pattern used for static resources.
	 */
	private String staticPathPattern = "/**";

/**在url中就是相当于http://localhost:8080/,到此为止,我们就知道了静态资源访问的根目录了。

下面,我们只需要找到上述的根目录映射到哪里就可以了。在代码02中有一个getStaticLocations获取静态资源位置的方法,这正是根目录的映射位置。点开如下:

	public String[] getStaticLocations() {
		return this.staticLocations;
	}

点开staticLocations静态位置后,如下:

	/**
	 * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
	 * /resources/, /static/, /public/].
	 */
	private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;

发现对应着classpath下的4个位置/META-INF/resources/,/resources/,/static/,/public/
值得说明的是classpath对应的位置就是src/main/resources或者target/classes/



二、测试

1、环境搭建

classpath 对应的4个位置中的 static 已经存在,如下:
在这里插入图片描述
接下来,我们手动创建剩下的3个目录并创建响应的测试文件,如下:
在这里插入图片描述

2、url获取资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


三、优先级

经过测试,得出的优先级如下:

/META-INF/resources/ > /resources/ > /static/ > /public/



天下无难事,只怕有心人。天下无易事,只怕粗心人…
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值