本文档介绍了 Spring Framework 的资源抽象系统,它通过一个通用的 Resource 接口提供了对文件、类路径资源和外部资源的统一访问。该抽象层允许应用程序以一致的方式处理各种资源类型,无论它们的物理位置或访问方法如何。
有关类型解析和转换机制的信息,请参阅 类型系统和转换。有关响应式编程中使用的数据缓冲区抽象,请参阅 数据缓冲区。
Spring 的资源系统围绕 Resource 接口构建,它抽象了底层资源类型并提供了统一的内容访问 API。这种设计使得代码无需了解资源是来自类路径、文件系统、URL 还是其他来源,即可对其进行操作。
Resource 接口定义了处理资源的基本操作
| 方法 | 目的 |
|---|---|
exists() | 检查资源是否存在物理形式 |
isReadable() | 确定内容是否可读 |
getInputStream() | 打开输入流以读取内容 |
getURL() | 获取资源的 URL 句柄 |
getFile() | 获取文件句柄(如果可解析) |
contentLength() | 确定内容长度 |
lastModified() | 获取最后修改时间戳 |
createRelative() | 创建相对资源 |
getFilename() | 提取文件名 |
来源: spring-core/src/main/java/org/springframework/core/io/Resource.java57-205 spring-core/src/main/java/org/springframework/core/io/AbstractResource.java48-261
Spring 提供了 Resource 接口的几种具体实现,每种实现都针对特定的资源类型和访问模式进行了优化。
ClassPathResource 实现处理位于类路径上的资源,支持类路径结构中的绝对路径和相对路径。
主要特性
来源: spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java47-286
UrlResource 实现包装 java.net.URL 对象,并提供额外的 Spring 特定功能,包括自动基本认证和相对路径解析。
主要功能
来源: spring-core/src/main/java/org/springframework/core/io/UrlResource.java49-372
FileSystemResource 实现通过传统的 File 和 NIO Path API 处理文件系统资源,并实现了 WritableResource 接口以支持输出操作。
来源: spring-core/src/main/java/org/springframework/core/io/FileSystemResource.java63-403
Module.getResourceAsStream() 访问 Java 模块内的资源UrlResource,具备缓存和写入能力FileSystemResource 取代来源: spring-core/src/main/java/org/springframework/core/io/ModuleResource.java45-108 spring-core/src/main/java/org/springframework/core/io/FileUrlResource.java47-115 spring-core/src/main/java/org/springframework/core/io/PathResource.java62-328
资源加载系统提供了一种使用位置字符串从各种源加载资源的一致方式。ResourceLoader 接口定义了契约,其中 DefaultResourceLoader 提供了主要的实现。
加载过程遵循以下优先级
主要类
ResourceLoader:定义 getResource(String location) 的接口DefaultResourceLoader:支持协议解析器的标准实现ProtocolResolver:自定义资源协议的扩展点来源: spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java50-192
PathMatchingResourcePatternResolver 扩展了基本资源加载,增加了模式匹配功能,允许应用程序使用通配符和 Ant 风格的模式查找多个资源。
| 模式类型 | 示例 | 描述 |
|---|---|---|
| 简单路径 | com/example/config.xml | 单一资源查找 |
| Ant 通配符 | com/example/*.xml | 目录中匹配模式的文件 |
| 递归 | com/example/**/*.xml | 子目录中匹配模式的文件 |
| 全类路径 | classpath*:META-INF/*.xml | 跨类路径的所有匹配资源 |
| 组合 | classpath*:com/example/**/*-config.xml | 包含多个通配符的复杂模式 |
全类路径支持:classpath*: 前缀在整个类路径中搜索所有匹配的资源,包括多个 JAR 文件和目录。
JAR 文件处理:遍历 JAR 文件内容的特殊逻辑,通过缓存优化性能。
模块路径集成:从 Spring Framework 6.0 开始,除了传统的类路径外,还会搜索 Java 模块系统。
缓存策略:针对根目录、JAR 条目和清单条目提供多级缓存以提高性能。
ResourceUtils 类提供了用于处理资源位置、URL 和文件系统操作的实用方法,作为 Spring 资源抽象与标准 Java I/O 之间的桥梁。
主要工具类别
isUrl(), isFileURL(), isJarURL()getURL(), getFile(), toURI(), toURL()extractJarFileURL(), extractArchiveURL()常用协议常量
CLASSPATH_URL_PREFIX: "classpath:"FILE_URL_PREFIX: "file:"JAR_URL_PREFIX: "jar:"URL_PROTOCOL_FILE: "file"URL_PROTOCOL_JAR: "jar"来源: spring-util/src/main/java/org/springframework/util/ResourceUtils.java52-472
资源系统与 Spring Framework 的其他组件集成
ResourceLoader 加载配置文件@PropertySource 和 @ImportResource 注解支持资源模式资源抽象为整个 Spring 生态系统中的一致资源处理奠定了基础,实现了与位置无关的资源访问模式。
来源: spring-core/src/main/java/org/springframework/core/io/DefaultResourceLoader.java50-192 spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java217-1497