其实SpringBoot默认会自动去以下位置寻找静态资源 :
-
classpath:/META-INF/resources/
-
classpath:/resources/
-
classpath:/static/
-
classpath:/public/
但是我们上传的图片通常不会放置在项目里面的,因为要打jar,所以图片一般放置在磁盘指定位置,因此需要告诉SpringBoot ,一般需要做如下配置
一、继承WebMvcConfigurerAdapter [已经过时]
产生诸多情况无法访问,配置麻烦,spring2.0以后不再建议使用
二、继承WebMvcConfigurationSupport [可使用]
@Configuration
public class CorsConfig extends WebMvcConfigurationSupport {
/**
* 添加静态资源文件,外部可以直接访问地址
*
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("profile/**").addResourceLocations("file:D:/upload/");
super.addResourceHandlers(registry);
}
}
缺点: 覆盖默认行为,造成static下的默认文件无法访问,还需添加以下代码
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
三、实现WebMvcConfigurer[官方推荐]
@Configurable
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("profile/**").addResourceLocations("file:D:/upload/");
}
}
测试结果如下:
总结:
-
使用 @EnableWebMvc 注解会完全覆盖默认行为。
-
继承WebMvcConfigurationSupport配置类也会覆盖默认行为。
也就是说如果不覆盖默认配置SpringBoot可以很好的工作,所以再次强调推荐使用实现WebMvcConfigurer的方式
后续:
classpath 顾名思义,就是指 .class 文件所在的路径。.class 文件由 .java 文件编译后产生,我们用 java 命令执行.class 文件时,需要指定 jvm 去哪搜索目标 class 文件,总不能全盘扫描对吧,而指定去哪搜索就是 classpath 的含义,即: classpath
是JVM用到的一个环境变量,它用来指示JVM如何搜索class
。
-
jar 包的 classpath
jar包还可以包含一个特殊的/META-INF/MANIFEST.MF文件,MANIFEST.MF是纯文本,可以指定Main-Class和其它信息。JVM会自动读取这个MANIFEST.MF文件,如果存在Main-Class,我们就不必在命令行指定启动的类名,而是用更方便的命令:java -jar hello.jar
-
SpringBoot 特殊的 classpat
综上 对于SpringBoot项目来说,
classpath
指的是在这三个路径下的文件,都可以认为是放在了classpath路径下的,可以使用classpath关键字作为相对路径的来引用 -
src.main.java
-
src.main.resources
路径 -
第三方jar包的根路径