spring核心技术之Resource资源理解


spring如何处理资源(Resource),我们如何在spring中和资源(Resource)工作呢?

1 介绍

java.net.URL

可以处理各种复杂的URL(统一资源定位),缺点是对于所有访问底层资源的能力还不够

例如还没有一种URL的实现可以访问需要从类路径或相对于ServletContext获得的资源虽然可以为专门的URL前缀注册新的处理程序(类似于现有的用于前缀的处理程序,如http:),但这通常非常复杂。而且URL接口仍然缺少一些需要的功能,比如检查被指向的资源是否存在的方法

思考:Resource接口是用来解决什么问题的?即URL接口的这些不足。

2 Resource 接口

比URL接口更强,用于抽象对底层资源的访问。

对比URL接口,Resource接口有何不同,URL表示一个统一的资源定位符,一个指向万维网上“资源”的指针,相较于Resource更加侧重于web资源,且无法判断资源是否存在

相较于URL Resource接口实现资源的抽象,可以检查资源是否存在。

URL protocol,host,port,authority,file,ref

resource接口提供哪些功能?
判断 提供资源 其他
isReadable URL createRelative
isOpen URI contentLength
isFile File lastModified
exists InputStream ReadableByteChannel

通过字符串路径上的特殊前缀,指定必须创建和使用特定的资源实现,例如:ftp,http,file

资源抽象不能代替功能。在可能的地方进行包装。例如,UrlResource包装一个URL并使用包装后的URL来完成它的工作。

Resource接口的子类有以下这些

resouce接口继承结构

3 spring为我们提供了哪些内置的Resource实现

3.1 URLResource

包装了URL接口,可以用来访问File,Http,ftp等其他对象,UrlResource是由Java代码显式地使用UrlResource构造函数创建的,但通常在调用API方法时隐式地创建,该方法接受一个表示路径的字符串参数。对于后一种情况,JavaBeans PropertyEditor最终决定创建哪种类型的资源。路径字符串包含众所周知的(也就是)前缀(例如classpath:),它为该前缀创建一个适当的专门化资源。但是,如果它不识别前缀,则假定该字符串是标准URL字符串,并创建一个UrlResource。

PropertyEditor

3.2 ClassPathResource

从类路径下获取(classpath),隐式创建当字符串路径上的特殊前缀classpath:,PropertyEditor将创建一个ClassPathResource实例

3.3 FileSystemResource

File和Path 的Resource实现,支持解析File和URL

3.4 InputStreamResource

InputStream的Resource实现,只有在没有特定的资源实现可用时,才应该使用它。特别是,尽可能选择ByteArrayResource或任何基于文件的资源实现。如果您需要将资源描述符保存在某个地方,或者需要多次读取流,请不要使用它

3.5 ByteArrayResource

这是一个给定字节数组的资源实现。它为给定的字节数组创建一个ByteArrayInputStream。它对于从任何给定的字节数组加载内容都很有用,而不必求助于一次性使用的InputStreamResource

classpath: ClassPathResource
File,Path FileSystemResource
InputStreamResource 尽量不用
ByteArrayResource byte array --ByteArrayInputStream

4 ResourceLoader 资源加载

由可以返回(即加载)资源实例的对象来实现的。

public interface ResourceLoader {

    Resource getResource(String location);
}

applicationcontext于resouce的关系,如果没有指定特殊前缀,将获得适合于特定应用程序上下文的资源类型

上下文类型
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值