Spring源码之Resources官方文档翻译

8.1简介

不幸的是,Java的标准java.net.URL类和用于各种URL前缀的标准处理程序并不足以对所有低级资源进行访问。例如,没有标准化的URL实现可以用于访问需要从类路径获得的资源,或者访问与servlet上下文相关的资源。虽然可以为专门化的URL前缀注册新的处理程序(类似于为前缀(如http:)注册现有的处理程序),但这通常非常复杂,URL接口仍然缺少一些理想的功能,例如检查所指向的资源是否存在的方法。

8.2Resource接口

Spring的Resource接口是一个更强大的接口,用于抽象对低级资源的访问。

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();

}
public interface InputStreamSource {

    InputStream getInputStream() throws IOException;

}

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

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

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

资源抽象在Spring本身中得到了广泛的使用,在需要资源时,它是许多方法签名中的参数类型。其他方法在某些Spring APIs(如各种ApplicationContext实现的构造函数),把一个字符串在朴实或简单的形式是用来创建一个上下文的资源适当的实现,或通过特殊前缀字符串路径,允许调用者指定一个特定的资源实现必须创建和使用。

虽然资源接口在Spring中使用得很多,而且每个Spring都使用它,但是在您自己的代码中作为通用实用程序类本身使用它来访问资源实际上非常有用,即使您的代码不知道或不关心Spring的任何其他部分。虽然这将您的代码耦合到Spring中,但它实际上只将它耦合到这个小的实用程序类集合中,这些实用程序类是URL的一个更强大的替代品,并且可以被认为与用于此目的的任何其他库等效。

需要注意的是,资源抽象并没有取代功能:它在可能的地方对功能进行包装。例如,UrlResource包装URL,并使用包装的URL完成其工作。

8.3内置资源实现

在Spring中有许多直接提供的资源实现:

8.3.1 UrlResource

UrlResource包装java.net.URL,可以用来访问任何对象,通常是通过一个URL,比如文件、一个HTTP目标,FTP target,等等。所有URL都有标准化的字符串表示,这样适当的标准化的前缀用于指示一个URL从另一个类型。这包括file:用于访问文件系统路径,http:用于通过http协议访问资源,ftp:用于通过ftp访问资源,等等。

UrlResource是由Java代码使用UrlResource构造函数显式创建的,但是在调用API方法时通常是隐式创建的,API方法接受一个字符串参数,该参数表示路径。对于后一种情况,javabean PropertyEditor最终将决定创建哪种类型的资源。如果路径字符串包含一些众所周知的前缀(即classpath:),那么它将为该前缀创建适当的专用资源。但是,如果它不识别前缀,它将假定这只是一个标准的URL字符串,并将创建一个UrlResource。

8.3.2 ClassPathResource

该类表示应该从类路径中获取的资源。它使用线程上下文类装入器、给定的类装入器或给定的类装入资源。

该资源实现支持java.io.File格式的解析。如果类路径资源驻留在文件系统中,而类路径资源驻留在jar中,并且还没有(通过servlet引擎或任何环境)扩展到文件系统,则不要这样做。为了解决这个问题,各种资源实现总是支持将解析作为java.net.URL。

ClassPathResource是由Java代码使用ClassPathResource构造函数显式创建的,但在调用API方法时通常是隐式创建的,该API方法接受一个字符串参数,该参数表示路径。对于后一种情况,JavaBeans PropertyEditor将识别字符串路径上的特殊前缀classpath:并在这种情况下创建一个ClassPathResource。

8.3.3 FileSystemResource

这是 java.io.File 的资源实现。文件句柄。它显然支持以文件和URL的形式进行解析。

8.3.4 ServletContextResource

这是servlet上下文资源的资源实现,解释相关web应用程序根目录中的相对路径。

它始终支持流访问和URL访问,但只允许ava.io.File当web应用程序归档文件展开且资源物理上位于文件系统上时的文件访问。它是否像这样展开并在文件系统上,或者直接从JAR或其他地方(如DB)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值