Spring Boot资源路径与ClassPathResource详解
一、ClassPathResource是什么?
代码:
java
ClassPathResource resource =
new ClassPathResource("template/" + tableName + ".xlsx");
拆分:
ClassPathResource
=
ClassPath + Resource
含义:
从Java程序运行时的类路径(classpath)中查找资源文件。
常用于读取:
- Excel模板
- 配置文件
- XML文件
- JSON文件
- 图片等项目内部资源
二、什么是classpath?
classpath:
中文:
类路径
简单理解:
Java程序运行时寻找类和资源文件的位置。
Spring Boot项目结构:
项目
|
|-- src
|
|-- main
|
|-- java
|
|-- resources
其中:
java目录
存放:
Java代码
例如:
Controller.java
Service.java
Entity.java
resources目录
存放:
项目资源文件
例如:
application.yml
Excel模板
XML文件
图片
JSON文件
三、resources为什么叫classpath?
项目启动后:
Maven会把:
src/main/resources
复制到:
target/classes
例如:
项目中:
src/main/resources/template/user.xlsx
编译后:
target/classes/template/user.xlsx
运行时:
target/classes
就是classpath。
所以:
classpath
=
target/classes
=
resources目录
四、template/为什么是在IDEA项目里面?
代码:
java
new ClassPathResource("template/user.xlsx");
这里的:
template/
不是:
浏览器路径
也不是:
http://localhost:8080/template/user.xlsx
而是:
后端项目resources目录下的文件夹
例如:
项目:
src/main/resources
|
|-- template
|
|-- user.xlsx
代码:
java
new ClassPathResource("template/user.xlsx");
Spring会寻找:
classpath/template/user.xlsx
实际位置:
target/classes/template/user.xlsx
五、浏览器和classpath的区别
浏览器访问:
http://localhost:8080/download/template
表示:
访问后端接口
浏览器不知道:
template/user.xlsx
这个文件。
完整流程:
浏览器
|
| HTTP请求
↓
Controller
|
| ClassPathResource读取文件
↓
resources/template/user.xlsx
|
| 输出文件流
↓
浏览器下载文件
六、为什么模板文件放resources?
因为模板属于:
系统固定资源
例如:
- Excel导入模板
- Word合同模板
- 邮件模板
特点:
开发人员维护
不会频繁变化
跟项目一起发布
所以放:
resources
七、Spring Boot常见资源目录
1. resources根目录
结构:
resources
|
|-- application.yml
用途:
配置文件
读取:
java
new ClassPathResource("application.yml");
2. template目录
结构:
resources
|
|-- template
|
|-- user.xlsx
用途:
模板文件
例如:
- Excel模板
- Word模板
- 邮件模板
读取:
java
new ClassPathResource("template/user.xlsx");
3. static目录
结构:
resources
|
|-- static
|
|-- css
|-- js
|-- images
用途:
静态资源
例如:
- CSS
- JavaScript
- 图片
浏览器可以直接访问:
localhost:8080/logo.png
4. public目录
结构:
resources/public
作用:
和static类似。
用于:
公开访问的静态文件
5. templates目录
注意:
template
和:
templates
不是一个东西。
templates:
用于:
后端页面模板
例如:
Thymeleaf:
resources/templates/user.html
Controller:
java
return "user";
Spring寻找:
templates/user.html
6. mapper目录
结构:
resources
|
|-- mapper
|
|-- UserMapper.xml
用途:
MyBatis XML映射文件
配置:
yaml
mybatis:
mapper-locations:
classpath:mapper/*.xml
表示:
从resources/mapper目录寻找xml文件
7. db目录
结构:
resources
|
|-- db
|
|-- schema.sql
|-- data.sql
用途:
数据库初始化脚本
八、classpath:是什么意思?
经常看到:
yaml
mybatis:
mapper-locations:
classpath:mapper/*.xml
classpath表示:
从类路径开始查找
也就是:
resources目录开始查找
例如:
classpath:mapper/UserMapper.xml
实际位置:
src/main/resources/mapper/UserMapper.xml
九、ClassPathResource和File路径区别
1. ClassPathResource
代码:
java
new ClassPathResource("template/test.xlsx");
查找:
项目内部资源
位置:
resources目录
适合:
- 模板文件
- 配置文件
- 固定资源
特点:
跟随项目打包
2. File文件路径
例如:
java
File file =
new File("/home/bes/upload/test.zip");
查找:
服务器磁盘
例如:
/home/bes/upload
适合:
- 用户上传文件
- 临时文件
- 业务数据文件
特点:
运行过程中动态产生
十、为什么上传文件不用ClassPathResource?
上传文件:
例如:
202605.zip
属于:
用户产生的数据
不能放:
resources
原因:
项目重新打包:
jar重新生成
可能导致:
文件丢失
所以:
上传文件保存:
服务器磁盘目录
例如:
/home/bes/upload
|
|--202605
|
|--tableName
|
|--xxx.zip
十一、结合项目中的两个场景
场景1:下载Excel模板
文件:
resources
|
|--template
|
|--config.xlsx
代码:
java
ClassPathResource resource =
new ClassPathResource("template/config.xlsx");
特点:
系统自带
固定文件
开发维护
场景2:下载用户上传文件
用户上传:
202605.zip
保存:
/home/bes/upload/202605/tableName/
读取:
java
File
InputStream
FileInputStream
特点:
用户产生
动态文件
数量变化
十二、总结
记忆:
ClassPathResource
=
找项目内部resources中的资源
classpath:
=
从resources目录开始查找
File路径
=
找服务器磁盘上的文件
对应关系:
系统模板文件
↓
resources/template
↓
ClassPathResource
用户上传文件
↓
服务器磁盘目录
↓
File路径
一句话:
固定的系统资源放resources,用ClassPathResource读取;动态产生的业务文件放服务器磁盘,用File路径读取。