Spring 包括多个内置 Resource 实现:
- UrlResource
- ClassPathResource
- FileSystemResource
- PathResource
- ServletContextResource
- InputStreamResource
-
UrlResource
UrlResource 包装了一个
java.net.URL
,可以用来访问任何通常可以用 URL 访问的对象,如文件、HTTPS 目标、FTP 目标等。所有的 URL 都有一个标准化的字符串表示,这样,适当的标准化前缀被用来表示一个 URL 类型与另一个 URL 类型。这包括: file:
用于访问文件系统路径https:
用于通过 HTTPS 协议访问资源ftp:
用于通过 FTP 访问资源
还有其他的资源等等。
UrlResource 是由 Java 代码通过明确使用 UrlResource 构造函数来创建的,但当你调用一个 API 方法时,往往是隐式创建的,该方法需要一个代表路径的 String 参数。对于后一种情况,JavaBeans 的 PropertyEditor 最终决定创建哪种类型的资源。如果路径字符串包含一个众所周知的(对属性编辑器来说)前缀(如 classpath:
),它将为该前缀创建一个适当的专用资源。然而,如果它不认识这个前缀,它就假定这个字符串是一个标准的 URL 字符串,并创建一个 UrlResource。
ClassPathResource
该类表示应从 classpath 获得的资源。它使用线程上下文的类加载器、一个给定的类加载器或一个给定的类来加载资源。
如果类路径资源驻留在 文件系统 中,该资源实现支持作为 java.io.File
的解析,但对于驻留在 jar 中且未被扩展(由 servlet 引擎或任何环境)到文件系统中的类路径资源则不支持。为了解决这个问题,各种资源实现总是支持解析为 java.net.URL
。
Java 代码通过明确使用 ClassPathResource 构造函数来创建 ClassPathResource,但当你调用一个 API 方法时,往往会隐含地创建,该方法需要一个字符串参数来表示路径。对于后一种情况,JavaBeans PropertyEditor 会识别字符串路径上的特殊前缀 classpath:
,并在这种情况下创建一个 ClassPathResource。
FileSystemResource
这是一个用于 java.io.File
句柄的资源实现。它也支持 java.io.file.Path
句柄,应用 Spring 标准的基于 String 的路径转换,但通过 java.io.file.Files
API 执行所有操作。对于纯粹的基于java.nio.path.Path
的支持,请使用 PathResource
代替。FileSystemResource 支持以文件和 URL 的形式解析。
PathResource
这是 java.nio.file.Path
处理的一个资源实现,通过 Path API 执行所有的操作和转换。它支持作为文件和 URL 的解析,也实现了扩展的 WritableResource 接口。PathResource 实际上是一个纯粹的基于java.nio.path.Path
的、具有不同 createRelative 行为的 FileSystemResource 替代品。
ServletContextResource
这是一个用于 ServletContext 资源的资源实现,它解释了相关 Web 应用程序根目录中的相对路径。
它始终支持 stream 访问和 URL 访问,但只有当 Web 应用程序归档文件被扩展并且资源在文件系统上时才允许 java.io.File
访问。无论它是否被扩展并在文件系统上,还是直接从 JAR 或其他地方(如数据库)访问(这是可以想象的),实际上都取决于 Servlet 容器。
InputStreamResource
InputStreamResource 是给定的 InputStream 的一个资源实现。只有在没有特定的资源实现的情况下才应该使用它。特别是在可能的情况下,最好选择 ByteArrayResource 或任何基于文件的 Resource 实现。
与其他资源实现不同,这是一个已经打开的资源的描述符。因此,它从 isOpen()
返回 true。如果你需要把资源描述符保存在某个地方,或者需要多次读取一个流,请不要使用它。
ByteArrayResource
这是一个给定字节数组的资源实现。它为给定的字节数组创建一个 ByteArrayInputStream。
它对于从任何给定的字节数组中加载内容是很有用的,而不必求助于单一用途的 InputStreamResource。