资源表示:Resource
Spring框架内部使用org.springframework.core.io.Resouce接口作为所有资源的抽象和访问接口。

它继承了 org.springframework.core.io.InputStreamSource接口。作为所有资源的统一抽象,Source 定义了一些通用的方法,由子类 AbstractResource 提供统一的默认实现。定义如下:

public
interface Resource extends InputStreamSource {

/**

* 资源是否存在

*/

boolean exists();

/**

* 资源是否可读

*/

default boolean isReadable() {

return true;

}

/**

* 资源所代表的句柄是否被一个stream打开了

*/

default boolean isOpen() {

return false;

}

/**

* 是否为 File

*/

default boolean isFile() {

return false;

}

/**

* 返回资源的URL的句柄

*/

URL getURL() throws IOException;

/**

* 返回资源的URI的句柄

*/

URI getURI() throws IOException;

/**

* 返回资源的File的句柄

*/

File getFile() throws IOException;

/**

* 返回 ReadableByteChannel

*/

default ReadableByteChannel
readableChannel() throws IOException {

return
Channels.newChannel(getInputStream());

}

/**

* 资源内容的长度

*/

long contentLength() throws IOException;

/**

* 资源最后的修改时间

*/

long lastModified() throws IOException;

/**

* 根据资源的相对路径创建新资源

*/

Resource createRelative(String
relativePath) throws IOException;

/**

* 资源的文件名

*/

@Nullable

String getFilename();

/**

* 资源的描述

*/

String getDescription();

}

Resouce接口可以根据资源的不同类型,或者资源位置的不同,给出对应的具体实现,Spring框架提供了一些实现类:

ByteArrayResource。将字节数组作为资源进行封装,如果通过InputStream形式访问该类型的资源,该实现会根据字节数组的数据,构造出对应的ByteArrayInputStream并返回。

ClassPathResource。从Java应用的classpath中加载具体的资源并封装,可以使用指定的类加载器或者给定的类进行资源加载。

FileSystemResource。对
java.io.File 类型资源的封装,只要是跟 File 打交道的,基本上与 FileSystemResource 也可以打交道。支持文件和 URL 的形式,实现 WritableResource 接口,且从 Spring Framework 5.0 开始,FileSystemResource 使用NIO.2 API进行读/写交互

UrlResource。通过java.net.URL进行具体资源查找定位的实现类。

InputStreamResource。将给定的InputStream视为一种资源的Resource实现类。

资源加载:ResourceLoader

在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。

org.springframework.core.io.ResourceLoader 为 Spring 资源加载的统一抽象,具体的资源加载则由相应的实现类来完成,所以我们将 ResourceLoader 称作为统一资源定位器。定义如下:

public interface ResourceLoader {

String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;

Resource getResource(String location);

ClassLoader getClassLoader();

}

ResourceLoader 接口提供两个方法:getResource()、getClassLoader()。

getResource()根据所提供资源的路径 location 返回 Resource 实例,但是它不确保该
Resource 一定存在,需要调用 Resource.exist()方法判断。该方法支持以下模式的资源加载:

URL位置资源,如”file:C:/test.dat”

ClassPath位置资源,如”classpath:test.dat”

相对路径资源,如”WEB-INF/test.dat”,此时返回的Resource实例根据实现不同而不同

getClassLoader() 返回
ClassLoader 实例,对于想要获取 ResourceLoader 使用的 ClassLoader 用户来说,可以直接调用该方法来获取,

对于想要获取 ResourceLoader 使用的 ClassLoader 用户来说,可以直接调用 getClassLoader() 方法获得。在分析 Resource 时,提到了一个类 ClassPathResource ,这个类是可以根据指定的 ClassLoader 来加载资源的。

最新文章

  1. 解析大型.NET ERP系统 版本控制
  2. 数据库排序sql,order by
  3. Matlab2015入门学习02
  4. 如何搭建Java开发环境(包括下载、安装和配置JDK)和Eclipse的安装
  5. Android AsyncTask完全解析,带你从源码的角度彻底理解
  6. css继承性和不继承的属性。
  7. Keil 4.7a版本问题&Jlink Clone问题
  8. Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)
  9. HDU 4716 A Computer Graphics Problem 2013年四川省赛题
  10. centos无线网卡设置
  11. 使用mui框架----移动端页面在所有屏幕下自适应
  12. java并发 - 自底向上的原理分析
  13. h5与c3权威指南笔记--css3结构性伪类选择器root,not,empty,target
  14. shell脚本解压多个jar包
  15. py库:threading
  16. Matplotlib学习---用matplotlib画折线图(line chart)
  17. input错误提示,点击提交,提示有未填项,屏幕滑到input未填项的位置
  18. java实现八种排序算法并测试速度
  19. PHP获取访客ip、系统、浏览器等信息[转]
  20. Android studio动态调试

热门文章

  1. 新增存储用Parted分区并建LVM卷
  2. asp.net 配置 web.config 禁用VS2013自带的Browser Link功能
  3. 第 10 章 python进程与多进程
  4. php配置 php-cgi.sock使用
  5. 应用安全 - 工具 - 中间件 - Apache - Apache Tika - 漏洞汇总
  6. mysql——多表——内连接查询
  7. PTA(Basic Level)1010.一元多项式求导
  8. Virtual DOM和snabbdom.js
  9. P1880石子合并
  10. [BZOJ2964]Boss单挑战