
Spring Boot资源路径与ClassPathResource详解一、ClassPathResource是什么代码ClassPathResourceresourcenewClassPathResource(template/tableName.xlsx);拆分ClassPathResource ClassPath Resource含义从Java程序运行时的类路径classpath中查找资源文件。常用于读取Excel模板配置文件XML文件JSON文件图片等项目内部资源二、什么是classpathclasspath中文类路径简单理解Java程序运行时寻找类和资源文件的位置。Spring Boot项目结构项目 | |-- src | |-- main | |-- java | |-- resources其中java目录存放Java代码例如Controller.java Service.java Entity.javaresources目录存放项目资源文件例如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项目里面代码newClassPathResource(template/user.xlsx);这里的template/不是浏览器路径也不是http://localhost:8080/template/user.xlsx而是后端项目resources目录下的文件夹例如项目src/main/resources | |-- template | |-- user.xlsx代码newClassPathResource(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用途配置文件读取newClassPathResource(application.yml);2. template目录结构resources | |-- template | |-- user.xlsx用途模板文件例如Excel模板Word模板邮件模板读取newClassPathResource(template/user.xlsx);3. static目录结构resources | |-- static | |-- css |-- js |-- images用途静态资源例如CSSJavaScript图片浏览器可以直接访问localhost:8080/logo.png4. public目录结构resources/public作用和static类似。用于公开访问的静态文件5. templates目录注意template和templates不是一个东西。templates用于后端页面模板例如Thymeleafresources/templates/user.htmlControllerreturnuser;Spring寻找templates/user.html6. mapper目录结构resources | |-- mapper | |-- UserMapper.xml用途MyBatis XML映射文件配置mybatis:mapper-locations:classpath:mapper/*.xml表示从resources/mapper目录寻找xml文件7. db目录结构resources | |-- db | |-- schema.sql |-- data.sql用途数据库初始化脚本八、classpath:是什么意思经常看到mybatis:mapper-locations:classpath:mapper/*.xmlclasspath表示从类路径开始查找也就是resources目录开始查找例如classpath:mapper/UserMapper.xml实际位置src/main/resources/mapper/UserMapper.xml九、ClassPathResource和File路径区别1. ClassPathResource代码newClassPathResource(template/test.xlsx);查找项目内部资源位置resources目录适合模板文件配置文件固定资源特点跟随项目打包2. File文件路径例如FilefilenewFile(/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代码ClassPathResourceresourcenewClassPathResource(template/config.xlsx);特点系统自带 固定文件 开发维护场景2下载用户上传文件用户上传202605.zip保存/home/bes/upload/202605/tableName/读取FileInputStreamFileInputStream特点用户产生 动态文件 数量变化十二、总结记忆ClassPathResource 找项目内部resources中的资源classpath: 从resources目录开始查找File路径 找服务器磁盘上的文件对应关系系统模板文件 ↓ resources/template ↓ ClassPathResource 用户上传文件 ↓ 服务器磁盘目录 ↓ File路径一句话固定的系统资源放resources用ClassPathResource读取动态产生的业务文件放服务器磁盘用File路径读取。