spring-boot 默认静态本地资源路径及自定义加载

1.spring boot默认加载文件的路径是 
/META-INF/resources/ 
/resources/ 
/static/ 
/public/ 
这些目录下面, 当然我们也可以从spring boot源码也可以看到 

代码如下所示
类ResourceProperties.class

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
private String[] staticLocations;

public ResourceProperties() {
  this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
  this.addMappings = true;
  this.chain = new ResourceProperties.Chain();
  this.cache = new ResourceProperties.Cache();
}

所有本地的静态资源都配置在了classpath下面了, 而非在webapp下了 

 

不知道大家看到这里有没有注意我的目录结构在4个文件夹中我们都拥有相同名字的6.jpg图片,那么在springboot在这种特殊的情况访问的顺序是怎样的呢,优先级顺序/META-INF/resources>resources>static>public,感兴趣的可以自己试一下
看到这里我们会不会有一个疑问难道在springboot中我们想访问静态资源的时候必须以springboot创建指定名称文件夹来访问么,当然不是,下面向大家分享一个自定义文件夹访问静态资源的方式
(1):首先创建一个java类

这里写图片描述

创建一个java类继承WebMvcConfigurerAdapter类并且重写addResourceHandlers方法,参数引用ResourceHandlerRegistry类这个对象调用addResourceHandler以及addResourceLocations方法,从俩个方法名我们不难看出前者是提供资源访问路径而后者是本地项目路径,那到底是什么意思呢?下面举例说明一下:

这里写图片描述

这里写图片描述
从上面俩张图片大家可以看出本地项目目录对应的就是addResourceLocations这个方法中传递的url参数,addResourceHandler方法就是资源访问url,在我们访问test/4.jpg时springboot会为我们在本地项目中找到testpicture这个文件夹中的4.jpg

看完自定义访问静态资源不知道大家有没有猜到为什么springboot可以访问/META-INF/resources,resources,static,public这4个文件夹下的静态资源,并且直接访问图片名称即可。下面我们来看一下springboot中的源码:
(1)打开WebMvcAutoConfiguration类找到addResourceHandlers方法:

这里写图片描述

从图中我们可以看到首先将变量staticPathPattern赋值然后将获取的值赋给资源访问路径方法,下面我们看一下staticPathPattern的值为什么
(2)打开WebMvcProperties类我们可以找到以下代码:

这里写图片描述

从图中我们可以看到值为/**这也就解释了为什么springboot在访问静态资源的时候只访问资源啊名称即可。
(3)下面我们继续查看WebMvcAutoConfiguration类:

这里写图片描述

(4)打开ResourceProperties类我们可以看到以下俩段代码:

这里写图片描述
在CLASSPATH_RESOURCE_LOCATIONS[] 这个数组中我们可以看到
“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”这4个属性,这就解释了为什么springboot可以直接访问1./META-INF/resources 2.resources 3.static 4.public这4个文件夹下的静态资源

3、Classpath含义

存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
存放模板文件 eg.actionerror.ftl
存放class文件对应的是项目开发时的src目录编译文件
总结:这是一个定位资源的入口
一般java项目中 classpath存在与 WEB-INFO/目录。
当我们需要某个class时,系统会自动在CLASSPATH里面搜索,如果是jar,就自动从jar里面查找,如果是普通的目录,则在目录下面按照package进行查找。
但与PATH不同的是,默认的CLASSPATH是不包含当前目录的,这也是CLASSPATH里面要包含一个点的道理了。

Tomcat下的Web应用有两个预置的classpath : WEB-INF/classes 和WEB-INF/lib启动项目,项目就会加载这两个目录里的数据。这是war包的规范.要改变预置的classpath比较麻烦,在Tomcat的配置文件里没有发现类似的配置,要实现自己的classloader才能达到目的。

一个在tomcat中运行的web应用.它的classpath都包括如下目录:
我知道的有:
%tomcat%/lib
web-inf/lib
web-inf/classes
环境变量里的classpath

总结:classpath这是一个定位资源的入口.classpath下 lib的优先级大于classes;

 

你可能感兴趣的:(SpringBoot-原理)