位于 org.springframework.core.io.包中的 Spring 的 Resource 接口是为了成为一个更有能力的接口,用于抽象出对低级资源的访问。下面的列表提供了资源接口的概述。更多细节请参见 Resource javadoc。

    1. public interface Resource extends InputStreamSource {
    2. boolean exists();
    3. boolean isReadable();
    4. boolean isOpen();
    5. boolean isFile();
    6. URL getURL() throws IOException;
    7. URI getURI() throws IOException;
    8. File getFile() throws IOException;
    9. ReadableByteChannel readableChannel() throws IOException;
    10. long contentLength() throws IOException;
    11. long lastModified() throws IOException;
    12. Resource createRelative(String relativePath) throws IOException;
    13. String getFilename();
    14. String getDescription();
    15. }

    正如 Resource 接口的定义所示,它继承了 InputStreamSource 接口。下面的列表显示了 InputStreamSource 接口的定义:

    1. public interface InputStreamSource {
    2. InputStream getInputStream() throws IOException;
    3. }

    下面是 Resource 接口中的一些重要方法:

    • getInputStream():定位并打开资源,返回一个用于读取资源的 InputStream。我们期望每次调用都能返回一个新的 InputStream。关闭该流是调用者的责任。
    • exists():返回一个 boolean,表示该资源是否以物理形式实际存在。
    • isOpen():返回一个 boolean,表示该资源是否代表一个具有开放流的句柄。如果为真,InputStream 不能被多次读取,必须只读一次,然后关闭,以避免资源泄漏。对于所有通常的资源实现,除了 InputStreamResource 之外,返回 false。
    • getDescription():返回该资源的描述,用于处理该资源时的错误输出。这通常是完全合格的文件名或资源的实际 URL。

    其他方法让你获得代表资源的实际 URL 或文件对象(如果底层实现兼容并支持该功能)。

    Resource 接口的实现支持写入的资源的扩展接口 WritableResource 接口(WritableResource 实现了 Resource 接口,表示支持通过 WritableResource 可以对文件进行写入)。

    Spring 本身也广泛使用了资源抽象,当需要资源时,它是许多方法签名中的参数类型。一些 Spring API 中的其他方法(例如各种 ApplicationContext 实现的构造器)接受一个字符串,该字符串以未经修饰或简单的形式被用来创建适合该上下文实现的资源,或者通过字符串路径上的特殊前缀,让调用者指定必须创建和使用一个特定的资源实现。

    虽然 Resource 接口在 Spring 中被大量使用,但在你自己的代码中,它作为一个普通的实用类,用于访问资源,即使你的代码不知道或不关心 Spring 的任何其他部分,它实际上也非常方便。虽然这将你的代码与 Spring 联系在一起,但它实际上只是与这一小部分实用类联系在一起,它可以作为 URL 的一个更有能力的替代品,可以被认为等同于你用于这一目的的任何其他库。

    :::info 资源抽象并不取代功能。它尽可能地包装它。例如,UrlResource 包装了一个 URL,并使用被包装的 URL 来完成其工作。 :::