spring源码解析之spring对各类资源加载

简介

在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。
Spring 提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。

spring资源加载涉及类

spring对资源的加载主要在以下几个类里实现。分别对应不同类别资源的加载。

  1. UrlResource 对url资源进行加载

  2. ClassPathResource 对类路径资源进行加载,默认路径是项目对应的的classpath路径。

  3. FileSystemResource 对文件系统资源加载,默认路径是系统文件资源的路径

  4. PathResource

  5. ByteArrayResource

  6. InputStreamResource

Resource继承关系.png

在上面对不同资源的加载实现方法中,都继承了Resource接口。对资源的的操作方法在Resource进行了定义。

Resource接口定义.png

InputStreamSource接口解析:

  • getInputStream:每次调用都将返回一个新鲜的资源对应的java.io. InputStream字节流,调用者在使用完毕后必须关闭该资源。

Resource接口继承InputStreamSource接口,并提供一些便利方法:

  • exists:返回当前Resource代表的底层资源是否存在,true表示存在。
  • isReadable:返回当前Resource代表的底层资源是否可读,true表示可读。
  • isOpen:返回当前Resource代表的底层资源是否已经打开,如果返回true,则只能被读取一次然后关闭以避免资源泄露;常见的Resource实现一般返回false。
  • getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IOException。
  • getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IOException。
  • getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IOException。
  • contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。
  • lastModified:返回当前Resource代表的底层资源的最后修改时间。
  • createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。
  • getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回,因为只返回文件路径。
  • getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)。

以UrlResource为例来具体说明资源加载的具体实现

UrlResource继承关系.png

通过类图可以发现,UrlResource主要实现了Resource接口,而对于一些基本的实现则利用抽象类进行封装,以达到可以通过继承抽象类,来实现代码的复用。

ClassPathResource继承关系.png

如ClassPathResource也同样继承了AbstractFileResolvingResource。通过对一些公用的方法利用抽象类的方式进行抽离封装,从而减少重复代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,891评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,947评论 6 342
  • 我就在这儿,什么地方都不去。我喜欢你,像生活在以你命名的朝代里。像你遗失的子民,每夜修补一个盛世。人们山南水北,人...
    我我我我_阅读 256评论 0 0
  • ——在学校发展中如何管理共性与个性 时间:2017年5月31日 旺苍校长研修群第16天 值日:韩虎 前言:...
    守候冬季阅读 886评论 0 1
  • 版本记录 前言 在app中,我们经常需要点击别人分享发布的图片或者头像,然后放大缩小等,还可以保存到本地相册等。感...
    刀客传奇阅读 949评论 0 1