其实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包的根路径

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐