文档章节

spring-003-Resource资源

haoran_10
 haoran_10
发布于 2016/07/15 16:44
字数 849
阅读 15
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

spring 提供一个Resource接口来统一底层资源一致的访问,而且提供了一些便利的接口

 

一、Resource接口

org.springframework.core.io.Resource,对InputStream进行了封装

package org.springframework.core.io; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URL; /** * Interface for a resource descriptor that abstracts from the actual * type of underlying resource, such as a file or class path resource. * * <p>An InputStream can be opened for every resource if it exists in * physical form, but a URL or File handle can just be returned for * certain resources. The actual behavior is implementation-specific. * @see #getInputStream() * @see #getURL() * @see #getURI() * @see #getFile() * @see WritableResource * @see ContextResource * @see FileSystemResource * @see ClassPathResource * @see UrlResource * @see ByteArrayResource * @see InputStreamResource * @see PathResource */
public interface Resource extends InputStreamSource { /** * 资源是否存在 */
    boolean exists(); /** * 资源是否可读 */
    boolean isReadable(); /** * 如果资源可读,返回true */
    boolean isOpen(); /** * 如果是一个URL资源,则返回 */ URL getURL() throws IOException; /** * 如果是一个URI资源,则返回 */ URI getURI() throws IOException; /** * 如果是一个文件资源,返回 */ File getFile() throws IOException; /** * 返回长度 */
    long contentLength() throws IOException; /** * 返回最后的修改时间 */
    long lastModified() throws IOException; /** * 根据相对路径创建资源 */ Resource createRelative(String relativePath) throws IOException; /** * 返回文件名称 */ String getFilename(); /** * 描述 */ String getDescription(); }

 

 源代码注释中直接也带上了Resource的实现类

  • org.springframework.core.io.ByteArrayResource 字节流的Resource
  • org.springframework.core.io.FileSystemResource 文件系统的Resource
  • org.springframework.core.io.ClassPathResource 基于classpath资源的Resource
  • org.springframework.core.io.UrlResource URL资源
  • org.springframework.core.io.ServletContextResource web应用资源

有两个实现需要特别提一下,ClassPathResource 和ServletContextResource 

1、ClassPathResource 

构造函数有三个:

public ClassPathResource(String path);//使用默认的ClassLoader加载资源

public ClassPathResource(String path, ClassLoader classLoader);//使用指定的ClassLoader

public ClassPathResource(String path, Class<?> clazz);//使用指定Class加载资源

加载资源的方法如下:

 @Override public InputStream getInputStream() throws IOException { InputStream is; if (this.clazz != null) { is = this.clazz.getResourceAsStream(this.path); } else if (this.classLoader != null) { is = this.classLoader.getResourceAsStream(this.path); } else { is = ClassLoader.getSystemResourceAsStream(this.path); } if (is == null) { throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist"); } return is; }

 

 代码里写的非常清晰,不需要累赘叙述了。

 

2、ServletContextResource  

ServletContextResource代表web应用资源,用于简化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作

 唯一的一个构造函数,事实上则是把ServletContext依赖在对象上

public ServletContextResource(ServletContext servletContext, String path) ;

 

 

加载资源方法,还是利用了servletContext.getResourceAsStream(String path)方法

@Override public InputStream getInputStream() throws IOException { InputStream is = this.servletContext.getResourceAsStream(this.path); if (is == null) { throw new FileNotFoundException("Could not open " + getDescription()); } return is; }

 

二、ResourceLoader

 org.springframework.core.io.ResourceLoader 接口,用来加载Resource

package org.springframework.core.io; import org.springframework.util.ResourceUtils; /** * @see Resource * @see org.springframework.core.io.support.ResourcePatternResolver * @see org.springframework.context.ApplicationContext * @see org.springframework.context.ResourceLoaderAware */
public interface ResourceLoader { /** Pseudo URL prefix for loading from the class path: "classpath:" */ String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX; /** * 根据路径返回资源 */ Resource getResource(String location); /** * 返回使用的ClassLoader */ ClassLoader getClassLoader(); }

 

主要两个类实现了方法

  • org.springframework.core.io.DefaultResourceLoader  默认提供,用来加载ClassPathResource,UrlResource
  • org.springframework.core.io.FileSystemResourceLoader 继承自DefaultResourceLoader ,加载FileSystemResource
  • org.springframework.core.io.ServletContextResourceLoader 继承自DefaultResourceLoader,加载ServletContextResource

而顶层容器ApplicationContext继承了ResourceLoader接口ApplicationContext的类,都具有加载资源的能力

 

 

三、ResourcePatternResolver 

org.springframework.core.io.support.ResourcePatternResolver继承ResourceLoader

package org.springframework.core.io.support; import java.io.IOException; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; public interface ResourcePatternResolver extends ResourceLoader { /** * Pseudo URL prefix for all matching resources from the class path: "classpath*:" */ String CLASSPATH_ALL_URL_PREFIX = "classpath*:"; /** * Resolve the given location pattern into Resource objects. */ Resource[] getResources(String locationPattern) throws IOException; }

 

主要根据路径可以解析多个资源

 

实现该接口的类 

  • org.springframework.core.io.support.PathMatchingResourcePatternResolver 可以自动识别资源类型
  • org.springframework.core.io.support.ServletContextResourcePatternResolver 继承自PathMatchingResourcePatternResolver ,添加了对web资源的识别

 

 

总结:基本上Spring Resource基础知识就这么多,事实上也是经过层层封装,最终的核心,还是File,InputStream,URI,加载的资源从文件系统,classpath,web资源, 网络上。

我想说的是,spring 提供丰富的工具封装了底层的技术,但是有点过度封装了,最终的核心其实就那么多。

 

© 著作权归作者所有

下一篇: 啥是JSONP---转
haoran_10
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
3.Spring Cloud初相识--------Ribbon客户端负载均衡

前言: 在生产环境中,未避免单点故障,每个微服务都会做高可用部署。 通白的说,就是每一个一模一样的服务会根据需求提供多分在多台机器上。 那么在大并发的情况下,如何分配服务可以快速得...

osc_6bjpmnwf
2018/10/24
4
0
Spring 中读取文件-ResourceLoaderAware

Spring 中读取文件-ResourceLoaderAware 概述 Spring ResourceLoader为我们提供了一个统一的getResource()方法来通过资源路径检索外部资源。从而将资源或文件(例如文本文件、XML文件、属性文...

osc_js57pdnd
2019/10/25
2
0
Spring资源加载器抽象和缺省实现 -- ResourceLoader + DefaultResourceLoader(摘)

概述 对于每一个底层资源,比如文件系统中的一个文件,classpath上的一个文件,或者一个以URL形式表示的网络资源,Spring 统一使用 Resource 接口进行了建模抽象,相应地,对于这些资源的加载...

osc_w1w21kiw
2019/04/26
1
0
【死磕 Spring】—– IOC 之 IOC 初始化总结

原文出自:http://cmsblogs.com 前面 13 篇博文从源码层次分析了 IOC 整个初始化过程,这篇就这些内容做一个总结将其连贯起来。 在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位...

chenssy
2018/10/09
0
0
Spring 资源访问剖析和策略模式应用

Spring 框架是一个非常优秀的轻量级 Java 框架,它的资源访问方式高度简化了应用程序的资源访问,将应用程序从底层不同的资源访问中解放出来,消除了不同资源访问方式的差异。Spring 框架的资...

IBMdW
2011/05/20
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Springboot Actuator

Springboot Actuator 1. 启用springboot actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>dep......

AngerWind
37分钟前
18
0
OSChina 周日乱弹 —— 一个幼小的猕猴桃等待食物转身

1@ 辽元 起床以后, 突然发现时间已经10点啦! 不会晚了吧? 忽然想起来今天是周末, 13 “梦见自己变成猫后,一下子惊醒了,不对是笑醒了。” @冰峰雪座 觉得昨晚的睡眠质量实在不是很好, ...

小小编辑
38分钟前
25
0
【第一行代码--Android】Kotlin入门教程精简版

Google在2017年的I/O大会上宣布Kotlin正式成为Android的以及开发语言,Android Studio也对Kotlin提供了全面支持。 怎样运行kotlin的代码?通过https://try.kotlinlang.org 或者 IDEA 以及 其...

Drop_Table_User
46分钟前
11
0
解决Cannot download "https://github.com/sass/node-sass/releases/download/binding.nod的问题

输入命令解决即可 npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

千年典韦
50分钟前
10
0
测试jar 是否完整有错

cd WEB-INF/lib/for j in *.jar; do echo $j; jar tvf $j > /dev/null ; echo $j done; done

xiaodong16
55分钟前
32
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部