Resource接口
【转】https://blog.csdn.net/hbtj_1216/article/details/85487787
参考:官方文档
1 简介
Java标准库中的java.net.URL类和标准处理器对于处理低层的资源没有提供很好的功能。例如,并没有提供一个URL的实现能够从classpath或者ServletContext中读取资源等等。因此,在Spring中提供了这样一个Resource接口,能够更加方便的读取各种资源。
2 Resource接口
Spring提供的Resource接口,是对第低层资源访问进行的一个抽象,提供能方便的使用。
下面是org.springframework.core.io.Resource接口的定义:
public interface Resource extends InputStreamSource {
/**
* 判断资源在物理上是否存在
*/
boolean exists();
/**
* 表明该资源中的非空内容是否可以通过getInputStream()读取
*/
default boolean isReadable() {
return exists();
}
/**
* 表明该资源是否被一个打开的stream处理
*/
default boolean isOpen() {
return false;
}
/**
* 判断该资源是否代表文件系统中的一个文件
*/
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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
Resource接口继承的InputStreamSource接口中海油一个非常重要的方法:
public interface InputStreamSource {
/**
* 找到并打开资源,返回读取资源内容的InputStream. 每次调用返回一个新的InputStream.
*/
InputStream getInputStream() throws IOException;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3 Spring中内置的Resource接口的实现类
Spring中包含了如下几个Resource接口的实现类:
- UrlResource:从
URL获取资源。 - ClassPathResource:从
classpath获取资源。 - FileSystemResource:从文件系统获取资源。
- ServletContextResource:从
servlet上下文获取资源。 - InputStreamResource:从
InputStream获取资源。 - ByteArrayResource:从字节数组获取资源。

UrlResource
UrlResource是对java.net.URL的封装,可以被用来访问任何可以通过URL访问的资源对象,例如文件、HTTP目标对象、FTP目标对象等等。
每种类型的URL都有表示该类型资源的前缀。例如file:表示访问文件系统的URL;http:表示通过http协议访问;ftp:表示通过ftp协议访问。
ClassPathResource
ClassPathResource表示从classpath中获取资源。
FileSystemResource
FileSystemResource是对java.io.File和java.nio.file.Path的封装,代表从文件系统中读取文件。
ServletContextResource
ServletContextResource是为了方便你从ServletContext中获取资源而设计的,可以从相对于web应用程序的根目录中获取资源。
InputStreamResource
InputStreamResource是用来从给定的InputStream中获取资源的。
ByteArrayResource
ByteArrayResource用来从给定的字节数组中获取资源,它会创建一个ByteArrayInputStream。
4 ResourceLoader
ResourceLoader接口是用来加载资源的,它提供了一个getResource函数用来返回一个Resource对象。下面是它的定义:
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
Resource getResource(String location);
@Nullable
ClassLoader getClassLoader();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
所有的应用程序上下文都实现了ResourceLoader接口,因此可以从应用程序上下文中获取Resource对象:
Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
- 1
如果在调用getResource()的时候,指定的资源路径上没有给出前缀,那么Spring会根据context的类型返回一个合适类型的资源对象。例如,在ClassPathXmlApplicationContext对象上调用getResource()函数,则会返回一个ClassPathResource对象。
如果你指定了前缀,那么不管context是什么类型,都将返回前缀对应的资源类型,例如:
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");
- 1
下表总结了资源路径对应的资源类型:
| 前缀 | 例子 | 说明 |
|---|---|---|
| classpath: | classpath:com/myapp/config.xml |
从classpath加载资源。 |
| file: | file:///data/config.xml |
从文件系统加载资源。 |
| http: | http://myserver/logo.png |
使用http协议加载资源。 |
| (none) | /data/config.xml |
根据context类型判断。 |
5 ResourceLoaderAware接口
ResourceLoaderAware是Spring提供的一个回调接口,用于注入ResourceLoader:
public interface ResourceLoaderAware extends Aware {
void setResourceLoader(ResourceLoader resourceLoader);
}
- 1
- 2
- 3
- 4
如果一个类实现了ResourceLoaderAware接口并在Spring上下文中注册为一个bean,那么context会调用它的setResourceLoader()方法将context本身设置进去(因为所有的context都实现了ResourceLoader接口)。
下面是一个例子:
@Component
public class ResourceBean implements ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
public ResourceLoader getResourceLoader() {
return resourceLoader;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
@Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("test/resourceLoaderAware.xml");
ResourceBean resourceBean = ctx.getBean(ResourceBean.class);
ResourceLoader loader = resourceBean.getResourceLoader();
Assert.assertTrue(loader instanceof ApplicationContext);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
上述方法采用实现
ResourceLoaderAware接口的方式注入ResourceLoader,属于侵入式的方法。从Spring 2.5之后,可以直接通过@Autowired自动注入的方式注入ResourceLoader。
6 应用个上下文和资源路径
6.1 构造一个应用上下文
应用上下文的构造函数通常将资源的路径以一个字符串或者字符串数组传入。当路径没有前缀的时候,资源的类型依据上下文的类型构建。
下面的例子,通过资源的路径构造一个ClassPathXmlApplicationContext上下文对象:
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
- 1
下面的例子,根据资源路径构造一个FileSystemXmlApplicationContext上下文对象:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
- 1
也可以通过路径前缀指定具体资源的类型。
6.2 资源路径支持通配符
可以通过*来表示一批资源文件:
/WEB-INF/*-context.xml
com/mycompany/**/applicationContext.xml
file:C:/some/path/*-context.xml
classpath:com/mycompany/**/applicationContext.xml
- 1
- 2
- 3
- 4
6.3 classpath*:和classpath:
classpath*: 和classpath:的主要区别体现在:
classpath::只会在当前项目的WEB-INF/classes路径下查找文件。classpath*::不只在当前羡慕的WEB-INF/classes路径下查找文件,还会到第三方jar文件的WEB-INF/classes查找文件。
6.4 FileSystemResource的路径问题
为了兼容,FileSystemXmlApplicationContext中的相对路径和绝对路径都将视为相对路径,相对于当前项目的工作目录。
下面两个是等价的:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/context.xml");
- 1
ApplicationContext ctx = new FileSystemXmlApplicationContext("/conf/context.xml");
- 1
如果真的需要绝对路径,应该尽量使用UrlResource并通过file:前缀来指定:
// actual context type doesn't matter, the Resource will always be UrlResource
ctx.getResource("file:///some/resource/path/myTemplate.txt");
- 1
- 2
// force this FileSystemXmlApplicationContext to load its definition via a UrlResource
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:///conf/context.xml");
Resource接口的更多相关文章
- 攻城狮在路上(贰) Spring(三)--- Spring 资源访问利器Resource接口
Spring为了更好的满足各种底层资源的访问需求.设计了一个Resource接口,提供了更强的访问底层资源的能力.Spring框架使用Resource装载各种资源,包括配置文件资源.国际化属性文件资源 ...
- Resource接口,及资源
Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理.例如:URL资源.URI资源.File资源.ClassPath相关资源.服务器相关资源(VFS等)等等. 而这些资源的处 ...
- spring-第十四篇之资源访问Resource接口
1.Resource接口提供的主要方法 1>getInputStream():定位并打开资源,返回资源对应的输入流.每次调用都返回新的输入流.调用者必须负责关闭输入流. 2>isOpen( ...
- 通过Spring Resource接口获取资源
目录 1 Resource简介 2 通过ResourceLoader获取资源 3 在bean中获取Resource的方式 1 Resource简介 在S ...
- Spring系列.Resource接口
接口简介 JDK中提供了java.net.URL这个类来用于获取不同种类的资源(根据不同前缀的url可以获取不同种类的资源).但是URL这个类没有获取classpath和ServletContext下 ...
- Spring系列18:Resource接口及内置实现
本文内容 Resource接口的定义 Resource接口的内置实现 ResourceLoader接口 ResourceLoaderAware 接口 Resource接口的定义 Java 的标准 ja ...
- Spring Resource接口获取资源
1.1.1. Resource简介 在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource. 1.1.1.1. 接口定义的方法 1.exists():判断资源文 ...
- Spring中Resource接口的前缀书写格式
Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt"); //这个 ...
- Bean利用Resource接口获取资源的几种方式
Resources的类型 获取resource的方式(xml配置正常进行):
随机推荐
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
- confluence6.14.1linux安装破解
一.简介 Confluence为团队提供一个协作环境.在这里,团队成员齐心协力,各擅其能,协同地编写文档和管理项目.从此打破不同团队.不同部门以及个人之间信息孤岛的僵局,Confluence真正实现了 ...
- 特征抽取: sklearn.feature_extraction.DictVectorizer
sklearn.featture_extraction.DictVectorizer: 将特征与值的映射字典组成的列表转换成向量. DictVectorizer通过使用scikit-learn的est ...
- 2019年春季学期《C语言程序设计II》课程总结
2019年春季学期<C语言程序设计II>课程总结 1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型.运算符与表达式的自学情况,并讲解测验题目3.第 ...
- springboot使用neo4j
springboot2.2使用neo4j第一次更新先放一些代码进来,下次加注释1.引入相应的包<dependency> <groupId>org.springframework ...
- TypeScript 高级类型 类(class)
传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员来讲就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的. 从ECMAScript ...
- Java基础---Java 数组
数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致. 数组的定义 格式:数组定义格式详解: 数组存储的数据类型: 创建的数组容器可以存储什么数据类型. [] : 表示数组. 数组 ...
- 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]
1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...
- golang之new函数
另一个创建变量的方法是调用用内建的new函数.表达式new(T)将创建一个T类型的匿名变量,初始化为T类型的零值,然后返回变量地址,返回的指针类型为 *T . p := new(int) // p, ...
- 机器学习-聚类-k-Means算法笔记
聚类的定义: 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小,它是无监督学习. 聚类的基本思想: 给定一个有N个对象的数据集 ...