Spring 包括多个内置 Resource 实现:

还有其他的资源等等。

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。