文档章节

spring Resource接口

why_Dk37
 why_Dk37
发布于 2016/12/11 16:45
字数 902
阅读 1
收藏 0
点赞 0
评论 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

2.3 IoC容器的初始化过程

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

edwardGe ⋅ 05/27 ⋅ 0

Spring系列之Spring常用注解总结

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点: 1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么...

HJCui ⋅ 05/29 ⋅ 0

spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

在spring boot 1.5.x中,resources/static目录下的静态资源可以直接访问,并且访问路径上不用带static,比如静态资源放置位置如下图所示: 那么访问静态资源的路径可以是: http://localhost...

Mr---D ⋅ 04/13 ⋅ 0

说说 Spring 的注解配置

1 定义 Bean XML 或注解配置方式,都是表达 Bean 定义的载体,其实质都是为 Spring 容器提供 Bean 定义的信息 。 基于注解的配置方式,从 Spring2.0 开始引入, Spring2.5 完善, Spring4.0 ...

deniro ⋅ 05/10 ⋅ 0

Spring 常用的注解及“依赖注入”的实现

1、spring注解 @Controller 声明Action组件 @Service 声明Service组件 @Service("myMovieLister") @Repository 声明Dao组件 @Component 泛指组件, 当不好归类时. @RequestMapping("/menu") ......

沉淀人生 ⋅ 05/28 ⋅ 0

深入理解Spring源码(一)-IOC容器的定位,载入,注册

前言:Spring源码继承,嵌套层次非常多,读起来非常容易晕,小伙伴们在看文章的时候一定要跟着文章的思路自己去源码里点一点,看一看,并且多看几次。就会越来越清晰。下面开始正题 1.Spring...

Meet相识_bfa5 ⋅ 05/01 ⋅ 0

Spring源码解析系列之IOC容器(一)

前言 实际上我所有的博客都是原来对原来印象笔记里笔记内容的加工,关于Spring源码自己已经解析了很多遍,但是时间长总是忘记,写一篇博客权当加强记忆,也算再次学习下大师们的设计思想,思...

后厂村老司机 ⋅ 06/02 ⋅ 0

maven+springMVC+mybatis+junit详细搭建过程

springMVC+mybatis框架搭建 在上一遍博客中以及讲诉了新建maven项目的流程,现在紧跟上一遍文章,接着搭建spring项目 首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什么样的效...

卐字旗下的余晖 ⋅ 2014/02/12 ⋅ 61

maven+springMVC+mybatis+junit详细搭建过程

首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什么样的效果,自己的功能有哪些? (假设效果:项目目录结构清晰,能够查询到本地数据库中的内容。。) 1. 工程目录结构整理清...

梵蒂冈考虑过 ⋅ 2016/08/16 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部