springspringboot静态资源导入探究

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springspringboot静态资源导入探究相关的知识,希望对你有一定的参考价值。

一个网站的搭建,避免不了静态资源的导入,哪在springboot中该如何配置静态资源呢?靠死记硬背?肯定不是,下面我将带大家从源码的角度分析出静态资源的配置文件夹

关键源码

        @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);
				
			);
		

源码讲解与展示

源码一:

if (!this.resourceProperties.isAddMappings()) 
		logger.debug("Default resource handling disabled");
		return;


这句话表示 是否添加了路径映射,如果没有添加,代码将不会继续往下执行。这个值默认是true,大家可以自己点进去看看 

 


源码二:

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

在浏览其中访问 /webjars/xxx文件 等价于 /META-INF/resources/webjars/xxx文件

补充:webjars其实是一个包管理网站:WebJars - Web Libraries in Jarshttps://www.webjars.org/

所以这行代码告诉我们静态资源可以放置两个位置:

  • 位置一:

效果展示:

  • 位置二: 

上面这个包是我儿通过maven导入的依赖:

<dependency>
      <groupId>org.webjars.npm</groupId>
      <artifactId>jquery</artifactId>
      <version>3.6.0</version>
</dependency>

运行效果


源码三:

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);
				
			);

这句代码的含义和源码二的含义很想:this.mvcProperties.getStaticPathPattern() ==》/** 点击源码可查看

this.resourceProperties.getStaticLocations() ==》  "classpath:/META-INF/resources/",
				"classpath:/resources/", "classpath:/static/", "classpath:/public/" ;

所以意思就是浏览器访问 /xxx文件 等价于访问  "classpath:/META-INF/resources/",
				"classpath:/resources/", "classpath:/static/", "classpath:/public/" 这四个文件夹下的文件,优先级为:数组第一个优先级最高

 这个大家可以自己新建几个文件夹试试

动态修改

在 application.yaml 中也提供了修改 this.mvcProperties.getStaticPathPattern() 的值,其值默认是 /** , 你也可以自己修改为 例如:/yiqi

spring:
  mvc:
    static-path-pattern: /yiqi/**

运行结果:

以上是关于springspringboot静态资源导入探究的主要内容,如果未能解决你的问题,请参考以下文章

SpringSpringBoot集成邮箱发送

AQS源码探究_03 成员方法解析(加锁资源竞争逻辑)

AQS源码探究_03 成员方法解析(加锁资源竞争逻辑)

springboot静态资源导入

SpringBoot--静态资源导入

springboot-静态资源处理