ResourceLoader 是 Spring 统一加载各类资源的核心接口,支持 classpath:、file:、http: 等前缀定位策略,通过 getResource() 获取 Resource 后可调用 exists()、getInputStream() 等方法安全读取,需注意 classpath 资源不可 getFile()、classpath*: 性能较低及非 Bean 中的获取方式。

Spring 的 ResourceLoader 是统一加载资源(如 classpath 文件、文件系统路径、URL 等)的核心接口,它屏蔽了底层资源位置的差异,让代码更灵活、可测试、可移植。
ResourceLoader 的基本用法
在 Spring 管理的 Bean 中,可以直接注入 ResourceLoader 实例(Spring 容器默认提供),然后调用 getResource(String location) 获取 Resource 对象:
-
classpath:config.properties→ 从类路径根目录查找 -
file:/opt/app/data.txt→ 读取绝对文件系统路径 -
http://example.com/data.json→ 加载远程资源(需对应协议支持) -
config.properties(无前缀)→ 默认按classpath:处理(取决于具体实现,如DefaultResourceLoader)
常见 Resource 前缀及含义
前缀决定资源定位策略,是关键细节:
- classpath: 从 classpath 根路径开始查找(推荐用于配置、模板等打包资源)
-
classpath*: 支持通配符,可在多个 jar 包中匹配同名资源(如
classpath*:META-INF/spring/*.xml) -
file: 映射为
FileSystemResource,适用于外部配置文件、上传目录等 -
http: 返回
UrlResource,适合加载远程内容(注意异常处理和超时) -
无前缀:行为由具体
ResourceLoader实现决定;DefaultResourceLoader默认视为classpath:
读取内容的典型操作
获取 Resource 后,常用方式有:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
resource.getInputStream()→ 获取字节流(适合二进制或小文本) -
resource.getFile().toPath()→ 转为Path(仅当资源是本地文件且可解析为File时可用;classpath:资源可能抛FileNotFoundException) -
resource.getURL()→ 获取 URL(适用于所有类型,但不保证可打开连接) -
resource.exists()→ 安全判断资源是否存在(强烈建议先调用)
示例:
Resource resource = resourceLoader.getResource("classpath:application.yml");
if (resource.exists()) {
try (InputStream is = resource.getInputStream()) {
// 处理内容
}
}
注意事项与避坑点
classpath: 资源在打包后位于 jar 内部,不能用 getFile() 直接转成 File 对象;若需文件路径语义,应改用 file: 或通过临时解压/复制到磁盘。
使用 classpath*: 通配符时性能略低(需遍历所有 classpath 元素),生产环境慎用于高频调用场景。
非 Spring Bean 类中无法直接注入 ResourceLoader,可考虑:
— 实现 ResourceLoaderAware 接口
— 使用静态工具类(如 ResourceUtils,但功能受限)
— 手动创建 DefaultResourceLoader(脱离容器管理,适合测试或独立模块)

















