SpringFramework核心技术二:Resources(加载资源的几种方式)

本文详细介绍了Spring Framework中Resources的概念,包括Resource接口及其多种实现,如UrlResource、ClassPathResource、FileSystemResource等。同时,讨论了ResourceLoader和ResourceLoaderAware接口的作用,以及在应用程序上下文中的资源路径处理,特别是通配符的使用。最后提到了FileSystemResource的注意事项,强调了在不同上下文中的使用区别。
摘要由CSDN通过智能技术生成

Resources的介绍

java.net.URL不幸的是,对于各种URL前缀,Java的标准类和标准处理程序不足以满足所有对低级资源的访问。例如,没有URL可用于访问需要从类路径获取的资源的标准化实现,或者相对于某个资源的获取 ServletContext。尽管可以为专用URL 前缀注册新的处理程序(类似于诸如前缀的现有处理程序http:),但这通常非常复杂,并且URL界面仍然缺少某些期望的功能,例如检查资源是否存在的方法指出。

一、资源的接口

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读取。预计每次调用都会返回一个新的 InputStream。主叫方有责任关闭该流。
  • exists():返回一个boolean指示这个资源是否实际存在的物理形式。
  • isOpen():返回一个boolean指示此资源是否表示具有打开流的句柄。如果true,则InputStream不能被多次读取,并且必须一次只能读取,然后关闭以避免资源泄漏。将false用于所有通常的资源实现,除了InputStreamResource。
  • getDescription():返回此资源的描述,用于处理资源时的错误输出。这通常是完全限定的文件名或资源的实际URL。

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

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

尽管Resource接口在Spring和Spring中被大量使用,但是在您自己的代码中使用它作为一个通用工具类来访问资源,即使您的代码不知道或关心其他任何部件的春天。虽然这会将你的代码结合到Spring上,但它实际上只是将它连接到这套小实用程序类,这些实用程序类可用作更强大的替代品URL,并且可以认为它与您用于此目的的任何其他库相当。

重要的是要注意,Resource抽象并不取代功能:它尽可能包装它。例如,UrlResource封装一个URL,并使用包装URL来完成其工作。

二、Spring内置Resource接口的实现

Resource在Spring 中有很多实现可以直接使用:

1.UrlResource对象

所述UrlResource包裹一个java.net.URL,并且可以被用于访问任何对象,该对象是通过URL正常访问,如文件,一个HTTP靶,FTP对象等的所有URL具有标准化的String表示,以使得适当的标准化的前缀被用来指示从另一个URL类型。这包括file:访问文件系统路径,http:通过HTTP协议 ftp:访问资源,通过FTP访问资源等。

A UrlResource是由Java代码使用UrlResource构造函数显式创建的,但是当您调用一个API方法时,通常会隐式创建它,该方法需要一个String 用于表示路径的参数。对于后一种情况,JavaBeans PropertyEditor将最终决定Resource要创建哪种类型。如果路径字符串包含一些众所周知的(就是它)前缀,例如classpath:,它将Resource为该前缀创建适当的专用。但是,如果它不能识别前缀,它会认为这只是一个标准的URL字符串,并且会创建一个UrlResource。

2.使用ClassPathResource

这个类代表了一个应该从classpath中获取的资源。这使用线程上下文类加载器,给定的类加载器或给定的类来加载资源。
此Resource实现支持解析,就java.io.File好像类路径资源驻留在文件系统中一样,但不支持放置在jar中并且尚未扩展(通过servlet引擎或任何环境)扩展到文件系统的classpath资源。
为了解决这个问题,各种Resource实现总是支持解析java.net.URL。
A ClassPathResource是由Java代码使用ClassPathResource 构造函数显式创建的,但是当您调用一个API方法时,通常会隐式创建它,该方法需要一个String用于表示路径的参数。
对于后一种情况,JavaBeans PropertyEditor将识别classpath:字符串路径上的特殊前缀,并ClassPathResource在这种情况下创建一个。

3.FileSystemResource

这是一个句柄的Resource实现java.io.File。它显然支持作为一个File和作为一个决议URL。

4.ServletContextResource

这是资源的Resource实现ServletContext,解释相关Web应用程序根目录中的相对路径。
这总是支持流访问和URL访问,但只允许jav

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值