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:表示访问文件系统的URLhttp:表示通过http协议访问;ftp:表示通过ftp协议访问。

ClassPathResource

ClassPathResource表示从classpath中获取资源。

FileSystemResource

FileSystemResource是对java.io.Filejava.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.xmlclasspath加载资源。
file:file:///data/config.xml从文件系统加载资源。
http:http://myserver/logo.png使用http协议加载资源。
(none)/data/config.xml根据context类型判断。

5 ResourceLoaderAware接口

ResourceLoaderAwareSpring提供的一个回调接口,用于注入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"); 

 

转载于:https://www.cnblogs.com/exmyth/p/11306759.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

播撒汗水,收获希望!

成长 从毕业起就进入软件行业已经走过5年的风雨历程,自己也从浪漫主义变为了现实主义,马上就到了而立之年,顿感压力很大,家已成、业未立。年龄的增长、家庭的牵绊、打工上班,受制于人,自己的命运掌握在他人…

JPA实体图

JPA 2.1的最新功能之一是能够使用实体图指定获取计划。 这很有用,因为它允许您自定义使用查询或查找操作检索的数据。 当使用中型到大型应用程序时,通常以不同的方式显示来自同一实体的数据。 在其他情况下,您只想选择最小的信息集即可优化应…

微信小程序实战–集阅读与电影于一体的小程序项目(三)

14.wx.showToast交互反馈 wx.showToast文档 post-detail.js添加个消息提示框 onCollectionTap: function(ev) {var postsCollected wx.getStorageSync(posts_Collected)var postCollected postsCollected[this.data.currentPostId]postCollected !postCollected;postsCol…

物理路径与虚拟路径 及Web Server

新建一个网站时: 完整路径:G:\wwwroot\WebSite1 WebSite1文件夹下有文件:Default.aspx 默认虚拟路径:/WebSite1 所以访问的时候应该这样:http://localhost:14595/WebSite1/Default.aspx 虚拟路径可以随便改:如改成 /,那么访问的时候就应该这样:http://localhost:14595/Defaul…

05—15

Que:在C中定义的结构体怎么连接到java里? c里面指向指针的指针怎么用jni写接口。 Everything is about the interface!转载于:https://www.cnblogs.com/claire-study-note/archive/2011/05/15/3065508.html

Quo Vadis JUnit

对我来说, JUnit是Java世界上最重要的库。 但是我认为它的新版本已经过期。 通过将方法定义作为测试定义的方法,JUnit非常灵活,需要各种技巧……抱歉的功能,要做您实际上应该能够使用的基本(Java 8)语言功能…

Angstrom移植操作

英码科技的文件系统是定制的The Angstrom Distribution Linux(以下简称Angstrom)。Angstrom是一个界面友好的嵌入式发行版本,用于手持设备,机顶盒和网络存储设备等嵌入式设备。关于Angstrom的相关资料可以登录http://www.angstrom…

仿淘宝网站的TabPage导航效果

代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"C…

Java SE 8新功能介绍:Lambda的遍历,过滤,处理集合和方法增强

在“ Java SE 8新功能导览”系列的这篇文章中&#xff0c;我们将深入解释并探索代码&#xff0c;以了解如何使用lambda表达式和方法引用 遍历集合 &#xff0c;并使用谓词接口过滤它们&#xff0c;实现默认方法在接口中&#xff0c;最后在接口中实现静态方法 。 在上一篇文章“…

【原】相煎何太急——input的blur事件与button的click事件

先来一段引子&#xff0c;最近在写手机h5页面&#xff0c;主要是一些登陆注册方面的&#xff0c;最绕不开的就是表单元素。 我想实现的是&#xff1a;在输入框后边有一个删除图标&#xff0c;当输入东西的时候触发事件&#xff0c;显示删除图标&#xff0c;点击该图标会删除之…

由浅入深:自己动手开发模板引擎——置换型模板引擎(一)

编辑器加载中... 转自&#xff1a;http://www.cnblogs.com/ymind/archive/2012/03/31/progressively-develop-templateEngine-yourself-replacement-type-1.html 受到群里兄弟们的竭力邀请&#xff0c;老陈终于决定来分享一下.NET下的模板引擎开发技术。本系列文章将会带您由浅…

C#锐利体验-第八讲 索引器与操作符重载(转)

第八讲 索引器与操作符重载 南京邮电学院 李建忠&#xff08;cornyfield263.net&#xff09; 索引 C#锐利体验 "Hello,World&#xff01;"程序C#语言基础介绍Microsoft.NET平台基础构造类与对象 构造器与析构器方法域与属性索引器与操作符重载 数组与字符串特征与映射…

Java EE 7 / JAX-RS 2.0:具有自定义HTTP标头的简单REST API身份验证和授权

在使用已可用的HTTP协议实施Web服务时&#xff0c;REST带来了很多便利。 通过仅通过指定的URL触发GET&#xff0c;POST和其他HTTP方法&#xff0c;您将确保通过REST服务的响应来完成某些工作。 但是&#xff0c;无论REST给开发人员带来了什么便利&#xff0c;安全性和访问控制的…

关于form标签,你该知道

有没有发现&#xff0c;自己在写模板的时候很少使用form元素&#xff0c;一来form和table总是那么傻傻分不清楚&#xff1b;二来form的特性理解不清楚&#xff0c;有了input、label来了直接就上&#xff0c;根本不用form&#xff08;不知道有没有人和我一样&#xff09;。因此&…

一个微软面试题--关于位结构体

含位域结构体的sizeof: 前面已经说过&#xff0c;位域成员不能单独被取sizeof值&#xff0c;我们这里要讨论的是含有位域的结构体的sizeof&#xff0c;只是考虑到其特殊性而将其专门列了出来。 C99规定int、unsigned int和bool可以作为位域类型&#xff0c;但编译器几乎都对此作…

easyui树形菜单实现

需求&#xff1a;读取路径配置中的相对路径获取对应的子文件夹及其子文件并形成树形结构&#xff0c;加载xml文件&#xff0c;输入搜索关键字匹配xml里面的value节点的值对应的contact值的集合并进行搜索 例如&#xff1a;输入b&#xff0c;找到xml里面的文本节点等于b的value…

在Twitter上使用Apache Mesos和Apache Aurora进行资源调度和任务启动

播客的第23集是与Bill Farner的谈话 Bill解释了Twitter如何使用Apache Mesos和Apache Aurora在硬件上获得更多收益&#xff0c;并通过在整个基础架构中利用细粒度的资源调度来节省工程时间&#xff08;开发和运营&#xff09;。 Bill谈到了他在Borg上与Google一起在Google上所…

fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

一、解决方法 右键点击你创建的项目&#xff0c;选择“属性标签”点击属性&#xff0c;弹出“项目属性页”&#xff0c;在左侧找到以下位置 配置属性 --> C/C --> 预编译头&#xff0c;并选择它&#xff1a;在右边的菜单中选择 “创建/使用预编译头”中的“不使用预编…

ubunt 下 配置samba 服务器

一. samba的安装: sudo apt-get insall sambasudo apt-get install smbfs 二。修改/etc/samba/smb.conf sudo gedit /etc/samba/smb.conf 在smb.conf最后添加 [myShare]comment Shared Folder with username and passwordpath /home/wangywriteable yesbrowseable yesguest…

Telnet初试(本地测试)

win7下开启Telnet功能&#xff1a; 控制面板-程序和功能- 开启服务 然后回车 这样即可完成一次请求 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com