2.2. Resource接口

位于org.springframework.core.io.包中的SpringResource接口旨在成为一个更强大的接口,用于抽象对低级资源的访问。以下清单提供了Resource界面的概述。有关详细信息,请参阅 Resourcejavadoc。

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isReadable();

    boolean isOpen();

    boolean isFile();

    URL getURL() throws IOException;

    URI getURI() throws IOException;

    File getFile() throws IOException;

    ReadableByteChannel readableChannel() throws IOException;

    long contentLength() throws IOException;

    long lastModified() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();
}

正如Resource接口的定义所示,它扩展了InputStreamSource 接口。以下清单显示了InputStreamSource 接口的定义:

public interface InputStreamSource {

    InputStream getInputStream() throws IOException;
}

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

  • getInputStream():定位并打开资源,返回一个InputStream用于从资源中读取。预计每次调用都会返回一个新的 InputStream. 调用者有责任关闭流。

  • exists():返回一个boolean指示此资源是否实际以物理形式存在的值。

  • isOpen():返回一个boolean指示此资源是否表示具有打开流的句柄。如果为true, 则InputStream不能多次读取,必须只读取一次然后关闭以避免资源泄漏。对于所有常用资源实现返回 falseInputStreamResource 除外)。

  • getDescription():返回此资源的描述,用于在使用该资源时输出错误。这通常是完全限定的文件名或资源的实际 URL。

其他方法让您获得表示资源的实际URLFile对象(如果底层实现兼容并支持该功能)。

Resource接口的一些实现还为支持写入的资源实现了扩展 WritableResource接口。

Spring 本身广泛使用Resource抽象,在需要资源时作为许多方法签名中的参数类型。某些 Spring API 中的其他方法(例如各种 ApplicationContext 实现的构造函数)采用 String,该 String 以原始或简单的形式用于创建适合该上下文实现的资源,或者通过 String 路径上的特殊前缀,让调用者指定必须创建和使用特定的资源实现。

虽然Resource接口在 Spring 和 Spring 中被大量使用,但实际上在您自己的代码中将其本身用作通用实用程序类非常方便,用于访问资源,即使您的代码不知道或不关心spring任何其他部分。虽然这会将您的代码与 Spring 耦合,但它实际上只将它耦合到这一小部分实用程序类,它可以作为更强大的替代品,URL并且可以被认为等同于您将用于此目的的任何其他库。

Resource抽象不会取代功能。它尽可能地包装它。例如,UrlResource 包装 URL 并使用包装的 URL 来完成其工作。

最后更新于