SpringBoot文件识别路径(classpath)
java项目中对于IO流读取文件与配置文件读取文件总结。
java文件夹与resources文件夹
对于大多数Java项目来说,src/main/java
和src/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下的路径,即:
总结起来,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)用来查找和加载类和资源的位置。当配置文件放在类路径下时,我们需要使用ClassLoader
或Class.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 |
|
然后,在Spring Boot应用程序中使用@Value
注解将属性值注入到变量中:
1 |
|
这样,appName
变量将被注入为My Application
。
在Spring Boot中,@Value
注解用于将外部配置文件中的值注入到Spring Bean中。通过使用@Value
注解,我们可以方便地将配置文件中的属性值注入到Spring Boot应用程序中的各个组件中。
使用@Value
注解的方式有两种:
- 直接注入属性值:在上述代码中,
1
2@Value("${property.key}")
private String propertyValue;"${property.key}"
是配置文件中的属性键,propertyValue
是要注入的属性值。Spring Boot会自动将配置文件中的属性值注入到propertyValue
变量中。 - 注入整个配置对象:在上述代码中,
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 |
|
这样,当Spring Boot应用程序启动时,@Value
注解将会自动将配置文件中的属性值注入到相应的变量中。
实例1:MybatisPlus-mapper文件路径配置
1 |
|
在配置文件中的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 |
|
经过这样的配置,当访问 /resources/
开头的 URL
时,Spring MVC 将会在 classpath:/static/
目录下查找匹配的静态资源文件。
默认的文件路径
如果你没有显式地在 Spring MVC 配置中指定资源处理器 (ResourceHandlerRegistry
) 的配置,Spring MVC 会提供以下默认的配置:
- 静态资源位置:Spring Boot 默认配置了一些静态资源文件夹的位置,这些位置包括:
/META-INF/resources/
/resources/
/static/
/public/
默认情况下,这些文件夹下的静态资源文件 (如CSS、JS、图片文件等) 都会被识别为可直接访问的静态资源。这些静态资源文件夹都是相对于 classpath(类路径)的根目录进行查找的。
- 默认首页:如果在请求的根路径上没有匹配到具体的处理器映射,Spring MVC 会尝试查找默认的首页文件:
index.html
index.htm
index.jsp
index.jsf
index.shtml
index.xht
index.xhtml
如果找到其中一个文件,Spring MVC 会将其作为默认的视图返回给用户。