接口简介

JDK中提供了java.net.URL这个类来用于获取不同种类的资源(根据不同前缀的url可以获取不同种类的资源)。但是URL这个类没有获取classpath和ServletContext下的资源的能力。因此Spring提供了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;
}
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 {

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

所有的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");

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

Spring系列.Resource接口的更多相关文章

  1. Spring系列.Environment接口

    Environment 接口介绍 在 Spring 中,Environment 接口主要管理应用程序两个方面的内容:profile 和 properties. profile 可以简单的等同于环境,比 ...

  2. Spring中Resource接口的前缀书写格式

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

  3. 攻城狮在路上(贰) Spring(三)--- Spring 资源访问利器Resource接口

    Spring为了更好的满足各种底层资源的访问需求.设计了一个Resource接口,提供了更强的访问底层资源的能力.Spring框架使用Resource装载各种资源,包括配置文件资源.国际化属性文件资源 ...

  4. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

  5. Resource接口,及资源

    Resource介绍 编码的时候,除了代码本身,我们还需要对外部的资源进行处理.例如:URL资源.URI资源.File资源.ClassPath相关资源.服务器相关资源(VFS等)等等. 而这些资源的处 ...

  6. 【Java】Spring之Resource(三)

    Java的各种URL前缀的标准类和标准处理程序不足以完全访问低级资源.例如,没有URL可用于访问需要从类路径或相对于a获取的资源的标准化实现 ServletContext.虽然可以为专用URL 前缀注 ...

  7. Spring系列18:Resource接口及内置实现

    本文内容 Resource接口的定义 Resource接口的内置实现 ResourceLoader接口 ResourceLoaderAware 接口 Resource接口的定义 Java 的标准 ja ...

  8. Spring资源访问接口Resource

    该接口拥有对不同资源类型的实现类 boolean exists() 资源是否存在 boolean isOpen() 资源是否打开 URL getURL() 如果底层资源可以表示成URL,则该方法返回对 ...

  9. Spring源码系列 — Resource抽象

    前言 前面两篇介绍了上下文的启动流程和Environemnt的初始化,这两部分都是属于上下文自身属性的初始化.这篇开始进入Spring如何加载实例化Bean的部分 - 资源抽象与加载. 本文主要从以下 ...

随机推荐

  1. Spring听课笔记(tg)2

    配置Bean -- 配置形式:基于XML 文件的方式, 基于注解的方式 -- Bean的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法&实例工厂方法).FactoryBean -- ...

  2. ceph --- (简单操作及openstack交接)

    部署ceph :https://www.cnblogs.com/cloudhere/p/10519647.html Centos7部署ceph:https://www.cnblogs.com/kevi ...

  3. ElasticSearch的查询(二)

    一.Query String search 添加测试数据 PUT test_search { "mappings": { "test_type": { &quo ...

  4. Deep Learning论文翻译(Nature Deep Review)

    原论文出处:https://www.nature.com/articles/nature14539 by Yann LeCun, Yoshua Bengio & Geoffrey Hinton ...

  5. IDLE怎么将主题修改成Darcula样式?

    摘要:每个人都有自己心中理想的编辑器主题,我更倾向于Darcula,你们呢? 想必没用过Darcula主题的朋友,会好奇它是何方神圣?   是不是很赏心悦目,代码这冰冷的东西也变得生龙活虎? 我最近在 ...

  6. 牛客15334 Easygoing Single Tune Circulation(后缀自动机+字典树)

    传送门:Easygoing Single Tune Circulation 题意 给定n个字符串 s[i],再给出m个查询的字符串 t[i],问 t[i] 是否为某个 s[i] 循环无限次的子串. 题 ...

  7. poj1061青蛙的约会 (扩展欧几里德)

    Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...

  8. hdu 2089不要62 (数位dp)

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来 ...

  9. python中is,== 和 in 的区别

    python对象的三个基本要素:id(身份标识),type(数据类型)和value(值). is 运算符:判断的是对象间的唯一身份标识(id). == 运算符:判断的是对象间的value(值)是否相同 ...

  10. nginx 80端口跳转到443

    nginx配置文件80配置中增加 rewrite ^ https://$http_host$request_uri? permanent; 如图: https://blog.csdn.net/jian ...