文档章节

spring Resource接口

why_Dk37
 why_Dk37
发布于 2016/12/11 16:45
字数 902
阅读 1
收藏 0

简述

Interface for a resource descriptor that abstracts from the actual type of underlying resource, such as a file or class path resource.

上面是Resource接口的doc描述,很明确的定义了接口的职责。它是资源的抽象,为应用提供了统一的访问api。

resource 接口方法

Resource 接口继承自 InputStreamSource ,接口中定了了很多方法,通过方法名可以很直观的知道方法的功能。

`` public interface Resource extends InputStreamSource {

/**
 * Return whether this resource actually exists in physical form.
 * <p>This method performs a definitive existence check, whereas the
 * existence of a {[@code](https://my.oschina.net/codeo) Resource} handle only guarantees a
 * valid descriptor handle.
 */
boolean exists();

/**
 * Return whether the contents of this resource can be read,
 * e.g. via {[@link](https://my.oschina.net/u/393) #getInputStream()} or {[@link](https://my.oschina.net/u/393) #getFile()}.
 * <p>Will be {[@code](https://my.oschina.net/codeo) true} for typical resource descriptors;
 * note that actual content reading may still fail when attempted.
 * However, a value of {[@code](https://my.oschina.net/codeo) false} is a definitive indication
 * that the resource content cannot be read.
 * @see #getInputStream()
 */
boolean isReadable();

/**
 * Return whether this resource represents a handle with an open
 * stream. If true, the InputStream cannot be read multiple times,
 * and must be read and closed to avoid resource leaks.
 * <p>Will be {@code false} for typical resource descriptors.
 */
boolean isOpen();

/**
 * Return a URL handle for this resource.
 * @throws IOException if the resource cannot be resolved as URL,
 * i.e. if the resource is not available as descriptor
 */
URL getURL() throws IOException;

/**
 * Return a URI handle for this resource.
 * @throws IOException if the resource cannot be resolved as URI,
 * i.e. if the resource is not available as descriptor
 */
URI getURI() throws IOException;

/**
 * Return a File handle for this resource.
 * @throws IOException if the resource cannot be resolved as absolute
 * file path, i.e. if the resource is not available in a file system
 */
File getFile() throws IOException;

/**
 * Determine the content length for this resource.
 * @throws IOException if the resource cannot be resolved
 * (in the file system or as some other known physical resource type)
 */
long contentLength() throws IOException;

/**
 * Determine the last-modified timestamp for this resource.
 * @throws IOException if the resource cannot be resolved
 * (in the file system or as some other known physical resource type)
 */
long lastModified() throws IOException;

/**
 * Create a resource relative to this resource.
 * @param relativePath the relative path (relative to this resource)
 * @return the resource handle for the relative resource
 * @throws IOException if the relative resource cannot be determined
 */
Resource createRelative(String relativePath) throws IOException;

/**
 * Determine a filename for this resource, i.e. typically the last
 * part of the path: for example, "myfile.txt".
 * <p>Returns {@code null} if this type of resource does not
 * have a filename.
 */
String getFilename();

/**
 * Return a description for this resource,
 * to be used for error output when working with the resource.
 * <p>Implementations are also encouraged to return this value
 * from their {@code toString} method.
 * @see Object#toString()
 */
String getDescription();

}


InputStreamSource 中只有一个方法,返回输入流,这个方法不是所有的子类都实现了,后面我会举例说明。

public interface InputStreamSource {

/**
 * Return an {@link InputStream}.
 * <p>It is expected that each call creates a <i>fresh</i> stream.
 * <p>This requirement is particularly important when you consider an API such
 * as JavaMail, which needs to be able to read the stream multiple times when
 * creating mail attachments. For such a use case, it is <i>required</i>
 * that each {@code getInputStream()} call returns a fresh stream.
 * @return the input stream for the underlying resource (must not be {@code null})
 * @throws IOException if the stream could not be opened
 * @see org.springframework.mail.javamail.MimeMessageHelper#addAttachment(String, InputStreamSource)
 */
InputStream getInputStream() throws IOException;

}


## 举例

spring Resource 有很多实现,下面描述几个有代表性的实现。

### AbstractResource

是一个模板模式的抽象类,实现了 exists , isReadable , isOpen , getURI ,contentLength, 等方法,
有些有些方法是空实现,如getFilename,createRelative,getFile,这些方法需要子类按需实现。

### ClassPathResource

用来加载classpath中的资源,spring在初始化的时候回使用这个类来加载xml配置文件。

public ClassPathXmlApplicationContext(String[] paths, Class<?> clazz, ApplicationContext parent) throws BeansException { super(parent); Assert.notNull(paths, "Path array must not be null"); Assert.notNull(clazz, "Class argument must not be null"); this.configResources = new Resource[paths.length]; for (int i = 0; i < paths.length; i++) { this.configResources[i] = new ClassPathResource(paths[i], clazz); } refresh(); }


### FileSystemResource

实现了 WritableResource 接口,该实现由写的能力。支持系统文件资源

FileSystemResource resource = new FileSystemResource(System.getProperty("java.io.tmpdir") + "/tmp.ftl");


### UrlResource

可以表示URl和file资源。

new UrlResource("http://localhost:8080")


# 小结

我们可以在项目中使用Resource接口,灵活的使用各种资源,这样屏蔽了实现,系统的兼容性更好。

© 著作权归作者所有

共有 人打赏支持
why_Dk37
粉丝 1
博文 22
码字总数 17584
作品 0
海淀
程序员
Spring中涉及的设计模式总结

Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是...

caoxiaohong1005
04/22
0
0
《Spring Recipes》第二章笔记:Loading External Resources

《Spring Recipes》第二章笔记:Loading External Resources 问题 程序需要从不同的位置(文件系统,classpath,URL)读取不同类型的资源(如文本文件,XML文件,properties文件或者图片)。程...

LiJIaming
2012/05/18
0
0
spring中resource注入注意问题

在控制层用resource注入service 而service中用了@Transaction注解时 报 Bean named 'xxxService' must be of type [com.xxx.xxxService], but was actually of type [$Proxy6]错误 解决如下:......

liangyx
2012/10/28
0
0
2.3 IoC容器的初始化过程

简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个启动包括BeanDefinition的Resource定位、载入和注册。 (1) Resource定位过程: 指的是BeanDefinition的资源定位,由Res...

edwardGe
05/27
0
0
Spring 的优秀工具类盘点,第 1 部分: 文件资源操作和 Web 相关工具类

Spring 不但提供了一个功能全面的应用开发框架,本身还拥有众多可以在程序编写时直接使用的工具类,您不但可以在 Spring 应用中使用这些工具类,也可以在其它的应用中使用,这些工具类中的大...

lvzjane
2014/03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
36分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
18
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
846
16
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部