文档章节

spring-003-Resource资源

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

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 提供丰富的工具封装了底层的技术,但是有点过度封装了,最终的核心其实就那么多。

 

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
Spring核心——JSR250与资源控制

JSR-175与元编程 要说明JSR-250先要解释清楚JSR-175,要解释清楚JSR就的先了解JCP是什么。网上资料很多,就不细说了,简单的说JCP(Java Community Process)是管理Java生态(包括J2SE、J2E...

随风溜达的向日葵
07/18
0
0
Spring 的优秀工具类盘点,第 1 部分: 文件资源操作和 Web 相关工具类

Spring 不但提供了一个功能全面的应用开发框架,本身还拥有众多可以在程序编写时直接使用的工具类,您不但可以在 Spring 应用中使用这些工具类,也可以在其它的应用中使用,这些工具类中的大...

lvzjane
2014/03/01
0
0
spring mvc - 对静态资源的处理

spring mvc - 对静态资源的处理 spring对静态资源文件(js css htm html jpg jepg png bmp)等的处理方式如下: 一、交由上级web容器处理,在web.xml中的org.springframework.web.servlet.Dis...

凯文加内特
2015/06/19
0
3
spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

在spring boot 1.5.x中,resources/static目录下的静态资源可以直接访问,并且访问路径上不用带static,比如静态资源放置位置如下图所示: 那么访问静态资源的路径可以是: http://localhost...

Mr---D
04/13
0
0
Spring中的优秀工具类(1):文件资源操作和 Web 相关工具类

文件资源操作 文件资源的操作是应用程序中常见的功能,如当上传一个文件后将其保存在特定目录下,从指定地址加载一个配置文件等等。我们一般使用 JDK 的 I/O 处理类完成这些操作,但对于一般...

采女孩的小蘑菇1
2014/03/31
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部