接口简介

JDK中提供了java.net.URL这个类来用于获取不同种类的资源(根据不同前缀的url可以获取不同种类的资源)。但是URL这个类没有获取classpath和ServletContext下的资源的能力。因此Spring提供了Resource接口,用于获取各种资源。

Resource接口

spring中的org.springframework.core.io.Resource接口代表着物理存在的任何资源,其继承于org.springframework.core.io.InputStreamSource。

Spring的资源接口是一个更强大的接口,用于抽象对低级资源的访问。

Resource接口的主要方法如下:

public interface Resource extends InputStreamSource {

boolean exists();

default boolean isReadable() {

return exists();

}

default boolean isOpen() {

return false;

}//加入Java开发交流君样:756584822一起吹水聊天

default boolean isFile() {

return false;

}

URL getURL() throws IOException;

URI getURI() throws IOException;

File getFile() throws IOException;

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();

}

关于上面提供的getURI和getURL方法这边做下解释。URI用于唯一指定互联网上一个资源的名字,我们可以理解为一个资源的唯一id。URL代表一个资源的唯一地址,我们通过这个地址可以在互联网上寻找到这个资源。通常可以用URL来代替URI。

Resource继承了InputStreamSource接口,下面是其定义:

public interface InputStreamSource {

//加入Java开发交流君样:756584822一起吹水聊天

InputStream getInputStream() throws IOException;

}

Resource的比较重要的方法如下:

getInputStream(): 定位和打开resource, 返回InputStream 来读取资源。每一次调用都会返回一个新的InputStream,调用者负责将其关闭。

exists(): 返回boolean,用来判断资源是否存在

isOpen(): 返回boolean,用来判断资源是不是已经存在一个open stream处理器。 true表明InputStream不能被多次读取,那么这次的读取会被关闭,以避免资源泄露。false是所有正常资源实现的返回,有可能会抛异常:InputStreamResource。

getDescription(): 返回资源的描述,用于错误输出。通常这会返回resource URL的全名。

其他的方法可以让你获取到代表resource的URL或者File对象。

Resource接口在Spring代码中非常常用,你也可以考虑应用到你的程序中。

内置的Resource实现

Spring中提供了很多Resource接口的实现类。主要有ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource和UrlResource。常用的有:

ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;

FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问;

ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。

UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”、“http:”。

ResourceLoader接口

ResourceLoader接口用来加载Resource资源。

public interface ResourceLoader {

Resource getResource(String location);

}//加入Java开发交流君样:756584822一起吹水聊天

所有的ApplicationContext类都实现了ResourceLoader接口,所以我们可以使用context来加载resource。

不同类型的ApplicationContext会返回不同的Resource。

当你在特定的应用程序上下文上调用getResource(),并且指定的位置路径没有特定的前缀时,你将返回适合该特定应用程序上下文的资源类型。例如,假设对ClassPathXmlApplicationContext实例执行了以下代码片段:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

ClassPathXmlApplicationContext返回ClassPathResource,FileSystemXmlApplicationContext返回FileSystemResource,WebApplicationContext返回ServletContextResource。 他会返回和ApplicationContext相对应的Resource实现。

当然,你可以强制ClassPathResource使用,而不管ApplicationContext到底是什么。使用的方法就是在资源路径前面加前缀。

Resource template1 = ctx.getResource("classpath:some/resource/path/myTemplate.txt");

Resource template2 = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");

Resource template3 = ctx.getResource("file:///some/resource/path/myTemplate.txt");

//加入Java开发交流君样:756584822一起吹水聊天

Resource[] template4 = ctx.getResources("file:///some/resource/path/my**a.txt");

ResourceLoaderAware接口

ResourceLoaderAware接口是一个特殊的回调接口,表明该组件需要提供一个ResourceLoader的引用。 下面是ResourceLoaderAware的定义:

public interface ResourceLoaderAware {

void setResourceLoader(ResourceLoader resourceLoader);

}

一个Bean如果实现了ResourceLoaderAware接口,容器在加载Bean的时候会给这个Bean注入一个ResourceLoad实现类(容器设置的ResourceLoad就是容器本身,因为所有的Spring application contexts 都实现了ResourceLoader 接口),利用这个实现类也可以加载Resource资源。

Resources as Dependencies#

不知道在讲什么,后续再整理。。。

构造 ApplicationContext#

//从classpath下寻找配置文件构造ApplicationContext

ApplicationContext ctx = new

//加入Java开发交流君样:756584822一起吹水聊天ClassPathXmlApplicationContext("conf/appContext.xml");

//从当前工作目录寻找配置文件构造FileSystemXmlApplicationContext

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");

//由于加了classpath前缀,所以从classpath下寻找配置构造FileSystemXmlApplicationContext

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");

//以MessengerService类所在的路径为基准路径,寻找services.xml和daos.xml作为配置文件

ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}, MessengerService.class);

通配符形式构造资源#

ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:conf/appContext.xml");

image

java resources介绍_Java之Resource接口相关推荐

  1. java英语介绍_java,英文介绍项目.doc

    java,英文介绍项目 java,英文介绍项目 篇一:Java开发常见英文 Java基础常见英语词汇(共70个) Author:ZW OO: object-oriented ,面向对象OOP: obj ...

  2. java技术介绍_Java技术汇总

    这篇文章总结了多年来使用Java的一些心得体会,主要是和一些Java基础知识点相关的,也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行业的准新手们,希望可以给大家一些经验,能让大家更好 ...

  3. java英语介绍_java自我介绍英语口语

    <java自我介绍英语口语>由会员分享,可在线阅读,更多相关<java自我介绍英语口语(6页珍藏版)>请在人人文库网上搜索. 1.java自我介绍英语口语 java技术的同学们 ...

  4. java过滤器命名_Java命名目录接口(JNDI)教程

    命名和目录操作 您可以使用JNDI执行以下操作:读取操作和更新命名空间的操作.本节介绍这两个操作: l查询对象 l列出上下文内容 l添加.覆盖和移除绑定 l重命名对象 l创建和销毁子上下文 配置 在命 ...

  5. java 集合 介绍_java集合类基本简介

    java集合类基本简介 序号 类描述 1 AbstractCollection 实现了大部分的集合接口. 2 AbstractList 继承于AbstractCollection 并且实现了大部分Li ...

  6. java resources 路径_Java工程读取resources中资源文件路径问题

    正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径.在本地工程和服务器中读取文件的方式有所不同,以下图配置文件为例. 本地读取资 ...

  7. java自我介绍_JAVA面试技巧之自我介绍

    [如何进行自我介绍] 自我介绍这个问题,不用多说了,面试必定会问!如果想要在自我介绍的时候就能够打动面试官,吸引面试官对我们的兴趣,那么像我们这种接受过Java培训的程序员的自我介绍当然不能和应届生或 ...

  8. java中塑形_Java学习5——接口和多态

    1 接口 接口相当于一个完全抽象的,没有任何实现的类 所有的成员函数都是抽象函数 所有的成员变量都是public static final而且一定要赋予初值 接口中的静态函数必须有函数体 接口在声明时 ...

  9. java抽象机制_Java很好学:接口+抽象类+事件监听机制

    接口?抽象类? 首先知道知道下接口.抽象类的概念 接口:只含有常量和抽象方法(只有方法名和参数不含方法体的方法) 抽象类:可以定义常量和抽象方法(和接口一样),还可以定义变量和普通方法和构造方法(和一 ...

最新文章

  1. Unity导出apk出现的问题,JDK,Android SDK,NDK,无“安装模块”
  2. 翻译下 golang package time
  3. jupyter !wget 等系统命令使用技巧
  4. 【2012百度之星/初赛上】C:集合的交与并
  5. python2和python3的一些区别
  6. 20150728月度会议
  7. Java数据库连接池c3p0和druid
  8. 博士论文答辩||基于深度强化学习的复杂作业车间调度问题研究
  9. 第八届全国噪声与振动控制工程学术会议大会报告
  10. 计算机维修管理平台软件,美萍电脑行业管理软件(电脑业务管理系统、电脑维修管理系统、组装业务、电脑装机管理软件)--管理软件,美萍是专家!...
  11. 计算机中0和1的表示
  12. 20年,中国互联网主流产品的演变和逻辑
  13. 鸿图之下服务器维护10月25,鸿图之下11月25日维护更新公告
  14. 【paper 2】Learning from Simulated and Unsupervised Images through Adversarial Training
  15. matlab 噪声检测,噪声环境下的信号检测及其matlab仿真 signal detection and matlab simulation in noise environment.pdf...
  16. 计算机课程打字教学,打字教程第1课 认识键盘
  17. MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法
  18. Vue v-if和-vshow的差异比较
  19. 如何查看python有哪些内置函数_如何查看 Python 全部内置变量和内置函数?
  20. 2018 年,做平凡世界里的超人

热门文章

  1. 如何把电脑文件备份?本指南很详细
  2. 用Python画笛卡尔坐标系
  3. winxp计算机名称改了恢复,WinXP如何修改Netbios名和计算机名有什么不同
  4. RTMP推流及协议学习
  5. 查找一段英文中各个单词出现的次数
  6. Nikkor镜头介绍
  7. adb linux无法识别手机,adb工具不识别手机解决办法
  8. 软件测试入门知识——学习笔记
  9. 【利用proteus建立8086最小系统】MASM32的安装下载问题
  10. Android端实现深度学习