Spring中的Resource接口
来源:互联网 发布:java自我介绍一分钟 编辑:程序博客网 时间:2024/05/18 17:27
Spring中的org.springframework.core.io.Resource接口代表着物理存在的任何资源,其继承于org.springframework.core.io.InputStreamSource;其子类有如下几种:ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource, UrlResource 。常用的有以下四种:
- ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;
- FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
- ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
- UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”
先看一下Resource接口的定义:
boolean exists();
boolean isOpen();
URL getURL() throws IOException;
File getFile() throws IOException;
Resource createRelative(String relativePath) throws IOException; //根据相对路径创建资源
String getFilename();
String getDescription();
}
它提供我们访问资源最基本的接口。我们实际访问的时候直接用Resource接口就可以,不比使用其子类。在初始化时,其子类的实现各有不同。
首先看最常用的ClassPathResource :
InputStream is = null;
if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
}
else {
is = this.classLoader.getResourceAsStream(this.path);
}
if (is == null) {
throw new FileNotFoundException(
getDescription() + " cannot be opened because it does not exist");
}
return is;
}
这个是ClassPathResource 获得InputStream的代码,可以看出,它是通过Class或者ClassLoader的getResourceAsStream()方法来获得InputStream的。关于这两个类的方法的区别我另外的一篇文章已经解释。其path一般都是以“classpath:”开头,如果以“classpath*:”开头表示所有与给定名称匹配的classpath资源都应该被获取。
其次来看FileSystemResource:
Assert.notNull(path, "Path must not be null");
this.file = new File(path);
this.path = StringUtils.cleanPath(path);
}
public InputStream getInputStream() throws IOException {
return new FileInputStream(this.file);
}
就是根据给定的Path来构造File,然后再构造FileInputStream。这儿的path一般要给出绝对路径,当然也可以是相对路径,但是如果使用相对路径要注意其根目录。例如在eclipse中,它的根目录就是你工程目录作为你的根目录。
再来看ServletContextResource:
InputStream is = this.servletContext.getResourceAsStream(this.path);
if (is == null) {
throw new FileNotFoundException("Could not open " + getDescription());
}
return is;
}
ServletContextResource通过ServletContext的getResourceAsStream()来取得InputStream,这里path必须以“/”开头,并且相对于当前上下文的根目录。如常用path="/WEB-INF/web.xml"。
最后来看UrlResource:
Assert.notNull(path, "Path must not be null");
this.url = new URL(path);
this.cleanedUrl = getCleanedUrl(this.url, path);
}
public InputStream getInputStream() throws IOException {
URLConnection con = this.url.openConnection();
con.setUseCaches(false);
return con.getInputStream();
}
UrlResource 封装了java.net.URL
,它能够被用来访问任何通过URL可以获得的对象,例如:文件、HTTP对象、FTP对象等。所有的URL都有个标准的 String
表示,这些标准前缀可以标识不同的URL类型,包括file:
访问文件系统路径,http:
通过HTTP协议访问的资源,ftp:
通过FTP访问的资源等等。
在Spring配置文件中,我们只需要给出字符串类型的path即可,Spring会通过ResourceEditor(java.beans.PropertyEditor的子类)和ResourceLoader把给定的path转换为相应的Resource。转换规则如下:
classpath:
classpath:com/myapp/config.xml
从classpath中加载。
file:
file:/data/config.xml
作为 URL
从文件系统中加载。
http:
http://myserver/logo.png
作为 URL
加载。
(none)
/data/config.xml
根据 ApplicationContext
进行判断。
摘自于Spring Framework参考手册
- Spring中的Resource接口
- Spring中的resource接口
- Spring中的Resource接口
- Spring中的Resource接口
- Spring中的Resource接口
- 【Spring学习笔记】Spring中的Resource接口
- Spring Resource接口
- Spring Resource接口
- 使用Spring中的Resource接口隔离对文件系统的依赖
- spring 中的@Resource
- spring 中的@Resource
- Spring资源抽象接口--Resource
- Spring资源抽象接口--Resource
- spring 的 resource接口概览
- Spring资源抽象接口--Resource
- Spring Resource接口获取资源
- Spring资源抽象接口Resource
- 通过Spring Resource接口获取资源
- 继承与派生
- Solr学习 DIH增量、定时导入并检索数据
- spring和springmvc的配置文件写法
- android java 在同时支持ipv4 与 ipv6 状况下,仅支持ipv4 或 ipv6的方法(测试中)
- Hibernate原生SQL查询
- Spring中的Resource接口
- 机器学习:用初等数学解读逻辑回归
- ckfinder 不支持带中文名图片附件上传,上传成功不能显示和下载
- gem Errno::ECONNRESET: Connection reset by peer - SSL_connect
- JavaScript面向对象编程
- 全功能智能车之无FIFO摄像头 DMA传送优化(第三篇)
- 遗传算法的matlab实现
- ubuntu 14.04 install g++ 问题"g++ : Depends: g++-4.8 (>= 4.8.2-5~) but it is not going to be installe"
- 麻将游戏的听牌算法