菜单

资源和 I/O

相关源文件

本文档介绍了 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

ClassPathResource 实现处理位于类路径上的资源,支持类路径结构中的绝对路径和相对路径。

主要特性

  • 移除前导斜杠以兼容 ClassLoader
  • 支持基于 ClassLoader 和基于 Class 的解析
  • 使用 Class 解析时将相对路径转换为绝对路径
  • 提供模块系统兼容性

来源: spring-core/src/main/java/org/springframework/core/io/ClassPathResource.java47-286

UrlResource

UrlResource 实现包装 java.net.URL 对象,并提供额外的 Spring 特定功能,包括自动基本认证和相对路径解析。

主要功能

  • 支持所有 URL 协议
  • 从 URL 用户信息中自动进行基本认证
  • 路径清理和规范化
  • 自定义 URLConnection 处理

来源: spring-core/src/main/java/org/springframework/core/io/UrlResource.java49-372

FileSystemResource

FileSystemResource 实现通过传统的 File 和 NIO Path API 处理文件系统资源,并实现了 WritableResource 接口以支持输出操作。

来源: spring-core/src/main/java/org/springframework/core/io/FileSystemResource.java63-403

其他实现

  • ModuleResource:使用 Module.getResourceAsStream() 访问 Java 模块内的资源
  • FileUrlResource:专用于文件 URL 的 UrlResource,具备缓存和写入能力
  • PathResource:已弃用的基于 NIO 的实现,已被 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 提供了主要的实现。

加载过程遵循以下优先级

  1. 协议解析器:用于特定协议的自定义解析器
  2. 基于路径:以 "/" 开头的资源
  3. 类路径:带有 "classpath:" 前缀的资源
  4. URL:有效的 URL 字符串
  5. 回退:默认路径解析

主要类

  • 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 条目和清单条目提供多级缓存以提高性能。

来源: spring-core/src/main/java/org/springframework/core/io/support/PathMatchingResourcePatternResolver.java217-1497

资源工具类

ResourceUtils 类提供了用于处理资源位置、URL 和文件系统操作的实用方法,作为 Spring 资源抽象与标准 Java I/O 之间的桥梁。

URL 和文件操作

主要工具类别

  • URL 检测isUrl(), isFileURL(), isJarURL()
  • URL/文件转换getURL(), getFile(), toURI(), toURL()
  • JAR 处理extractJarFileURL(), extractArchiveURL()
  • 路径处理:URL 编码,相对路径解析

协议常量

常用协议常量

  • 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 的其他组件集成

  • ApplicationContext:使用 ResourceLoader 加载配置文件
  • 配置@PropertySource@ImportResource 注解支持资源模式
  • Web 框架:静态资源服务和模板解析
  • 测试:测试资源加载和夹具管理

资源抽象为整个 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