SpringBoot文件识别路径(classpath)

java项目中对于IO流读取文件与配置文件读取文件总结。

java文件夹与resources文件夹

对于大多数Java项目来说,src/main/javasrc/main/resources是同级目录,它们在编译后都会出现在target/classes目录中。

  • src/main/java目录包含项目的Java源代码文件(.java文件)。在项目进行编译时,这些Java源文件会被编译成对应的字节码文件(.class文件)。
  • src/main/resources目录主要用于存放项目的非Java资源文件,如配置文件、XML文件、属性文件、图片、模板等等。这些资源文件在项目构建过程中会被复制到target/classes目录中。

编译后路径

在项目编译过程中,构建工具(如Maven、Gradle等)会将这两个目录的内容合并,并将编译后的字节码文件及资源文件一同放置在target/classes目录中。

  • 工程编译后,会将src/main/java中的.java文件按照包文件结构编译成.class存入target/classes目录。
  • 工程编译后,会将src/main/resources中的static、templates目录里的文件分别拷贝入classes/static 与classes/template 中。结构保持一致。
  • 工程编译后,会将test/java 中的文件编译进classes/test-classes目录中。

classpath关键字

classpath一般用来指代“src/main/resources”下的资源路径。其本质其实是指项目打包后的classes下的路径,即:

classes目录在运行时(例如使用 classpath: 前缀加载资源文件时)通常被认为是 classpath 的根目录。

总结起来,src/main/java用于存放Java源代码,src/main/resources用于存放非Java资源文件,而target/classes是编译后的输出目录,它包含了编译后的.class文件和resources文件,都可以被项目正确加载和使用。

什么时候需要加classpath

输入流不需要加classpath

在Java项目中,文件的读取方式是通过输入流(InputStream)来实现的。一般情况下,如果要读取文件,我们需要提供文件的绝对路径或者相对路径(相对于当前工作目录)。在这种情况下,不需要使用classpath。例如,如果要读取位于项目根目录下的一个文件,可以直接指定文件的路径,如/path/to/file.txt,而无需使用classpath。但是,对于配置文件,通常会放在项目的类路径(classpath)下,以便于项目在运行时能够方便地访问和加载配置文件。这是因为项目的类路径是Java类加载器(ClassLoader)用来查找和加载类和资源的位置。当配置文件放在类路径下时,我们需要使用ClassLoaderClass.getResourceAsStream()方法来获取配置文件的输入流。这些方法会相对于类路径(classpath)来查找文件,并返回文件的输入流。因此,配置文件需要加上classpath。

classpath可以省去路径输入

在Spring中,@PropertySource注解用于指定要加载的外部属性文件。使用classpath:前缀可以表示配置文件位于类路径下。

classpath:是一个特殊的URL前缀,它告诉Spring去类路径中搜索配置文件,而不是按照文件系统路径去搜索。这样,无论你的应用程序以何种方式运行,它都可以正确地加载配置文件。

通过在@PropertySource注解中使用classpath:前缀,你可以将配置文件直接放在classpath下,而不需要提供具体的文件路径。

例如,@PropertySource("classpath:config.properties")表示要加载位于类路径下名为config.properties的配置文件。

如果你未使用classpath:前缀,则Spring将按照标准的文件系统路径去搜索配置文件。这可能会导致在不同开发环境或部署环境中无法找到配置文件的情况。

因此,在使用@PropertySource注解时,使用classpath:前缀可以更可靠地定位和加载配置文件,无论应用程序在何种环境中运行。

@Value注入

你可以在配置文件中定义各种属性,并在应用程序中使用@Value注解或@ConfigurationProperties注解将属性值注入到相应的变量中。

例如,在application.properties文件中定义一个属性:

1
myapp.name=My Application

然后,在Spring Boot应用程序中使用@Value注解将属性值注入到变量中:

1
2
@Value("${myapp.name}")
private String appName;

这样,appName变量将被注入为My Application


在Spring Boot中,@Value注解用于将外部配置文件中的值注入到Spring Bean中。通过使用@Value注解,我们可以方便地将配置文件中的属性值注入到Spring Boot应用程序中的各个组件中。

使用@Value注解的方式有两种:

  1. 直接注入属性值:
    1
    2
    @Value("${property.key}")
    private String propertyValue;
    在上述代码中,"${property.key}"是配置文件中的属性键,propertyValue是要注入的属性值。Spring Boot会自动将配置文件中的属性值注入到propertyValue变量中。
  2. 注入整个配置对象:
    1
    2
    3
    4
    5
    6
    @ConfigurationProperties(prefix = "prefix")
    @Component
    public class MyConfig {
    private String propertyValue;
    // getter and setter methods
    }
    在上述代码中,@ConfigurationProperties注解用于指定配置文件中的属性前缀,MyConfig类中的属性将与配置文件中的属性进行匹配,并自动注入。

需要注意的是,为了使用@Value注解,我们需要在Spring Boot应用程序的配置类或组件类上添加@PropertySource注解,以指定要加载的配置文件。例如:

1
2
3
4
5
@Configuration
@PropertySource("classpath:config.properties")
public class AppConfig {
// configuration code
}

这样,当Spring Boot应用程序启动时,@Value注解将会自动将配置文件中的属性值注入到相应的变量中。

实例1:MybatisPlus-mapper文件路径配置

1
2
mybatis-plus: 
mapper-locations: classpath*:mapper/**/*.xml

在配置文件中的mybatis-plus部分,mapper-locations属性指定了Mapper XML文件的位置。具体含义如下:

mapper-locations属性用于指定Mapper XML文件所在的位置。可以使用Ant风格的路径匹配模式,例如classpath*:mapper/**/*.xml表示在classpath下的mapper目录及其子目录中查找所有的XML文件。通常,Mapper XML文件用于存放SQL语句和映射配置。

classpath*表示从classpath根目录开始查找文件。

mapper/**/*.xml表示在mapper目录以及其子目录中查找所有以.xml为后缀的文件。

这个配置可以确保MyBatis-Plus能够扫描到所有的Mapper XML文件,以便映射关系能够正确地配置和使用。

实例2:MVC配置类

在mvc配置类配置静态资源路径:

https://blog.csdn.net/weixin_51566349/article/details/131816800

版本1:实现WebMvcConfigurer 接口(推荐)

WebMvcConfig 类推荐实现 WebMvcConfigurer 接口,并重写了其中的方法。具体来说,addViewControllers 方法用于添加视图控制器,而 addInterceptors 方法用于添加拦截器。

该代码片段并没有对静态资源路径进行配置的部分。静态资源路径在 Spring MVC 中使用 addResourceHandlers 方法进行配置。通常,我们会在 WebMvcConfig 类中添加一个 addResourceHandlers 方法来指定静态资源的路径。

以下是一个示例,将 /resources/ 路径映射到 classpath:/static/ 目录:

1
2
3
4
5
6
7
8
9
10
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("classpath:/static/");
}

//...其他重写的方法
}

经过这样的配置,当访问 /resources/ 开头的 URL时,Spring MVC 将会在 classpath:/static/ 目录下查找匹配的静态资源文件。

默认的文件路径

如果你没有显式地在 Spring MVC 配置中指定资源处理器 (ResourceHandlerRegistry) 的配置,Spring MVC 会提供以下默认的配置:

  1. 静态资源位置:Spring Boot 默认配置了一些静态资源文件夹的位置,这些位置包括:
    • /META-INF/resources/
    • /resources/
    • /static/
    • /public/
      默认情况下,这些文件夹下的静态资源文件 (如CSS、JS、图片文件等) 都会被识别为可直接访问的静态资源。这些静态资源文件夹都是相对于 classpath(类路径)的根目录进行查找的。
  2. 默认首页:如果在请求的根路径上没有匹配到具体的处理器映射,Spring MVC 会尝试查找默认的首页文件:
    • index.html
    • index.htm
    • index.jsp
    • index.jsf
    • index.shtml
    • index.xht
    • index.xhtml
      如果找到其中一个文件,Spring MVC 会将其作为默认的视图返回给用户。

默认的什么都是什么路径


SpringBoot文件识别路径(classpath)
http://wahoyu.xyz/2023/08/30/SpringBoot文件识别路径(classpath)/
作者
Wahoyu
发布于
2023年8月30日
许可协议