Spring Boot资源路径与ClassPathResource详解

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路径读取。

相关推荐
学渣超1 小时前
微服务日志智能诊断系统(八) 全链路追踪——request_id驱动的跨服务诊断
java·后端·agent
ACGkaka_1 小时前
Spring Boot 实战(四十一):集成 BPMN(Flowable+bpmn-js)
java·spring boot·后端
学渣超2 小时前
微服务日志智能诊断系统(九) 让 LLM 成为日志分析专家
java·后端·agent
学渣超2 小时前
微服务日志智能诊断系统(七) 日志 RAG 引擎——蒸馏、索引与精准检索
java·后端·agent
掉鱼的猫2 小时前
代码审查 Agent Harness 实战:AI 自动 Code Review
java·llm·agent
学渣超2 小时前
微服务日志智能诊断系统(六) Fast Path vs Slow Path——双路径日志诊断策略
java·后端·agent
添砖java_8572 小时前
网页聊天室测试报告
java·spring boot·spring·maven
hai3152475432 小时前
九章编译法:DEEPSEEK V3.2汇编编译实例
java·开发语言
ONE_SIX_MIX2 小时前
lightweight-charts-onesixth v2.8.1 → v3.1.1 更新总览
java·前端·python