1-Resource

2020-02-14  本文已影响0人  鹏程1995

背景简介

出现的原因

在java中,将不同来源的资源抽象成 URL,通过注册不同的 handlerURLStreamHandler)来处理不同来源的资源读取逻辑。一般 handler 的类型使用不同的前缀(协议)来识别,如"file:","http:","jar:"。

Spring 框架涉及了大量的配置文件,在进行配置文件的读取时没有采用 Java 中的 URL框架,而使用了自己的Resource框架。未使用 URL 的原因如下:

  1. 默认的 URL 没有实现相对 Classpath或者ServletContexthandler。我们在做项目时配置文件一般跟着项目包走,大部分还是Classpath。如果要正常使用,需要了解 URL 的机制并定制对应的"classpath:"的handler
  2. URL 没有提供基本的方法,如检测资源是否存在、是否可读等。

职责

一个统一的 Spring 框架的资源读取接口。用于封装底层资源。

接口继承情况

1.png

源码

InputStreamSource了解

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}

这个接口很简单,调用getInputStream()默认返回对他包装的资源的一个全新的输入流【源是可以支持重复读的,但获得的 Stream 看情况可能不支持重复读】

Resource接口介绍

public interface Resource extends InputStreamSource {

    /**
     * 判断这个 Resource 指定的源是否存在
     */
    boolean exists();

    /**
     * 表明 Resource 指定的源是否可以通过 getInputStream() 进行读取
     */
    default boolean isReadable() {
        return true;
    }

    /**
     * 表明 Resource 指定的源是否遵循开启关闭。
     * 如果是 true ,读取完流之后要记得调用关闭方法。
     * 注意: 源是可以重复读的,但是返回的流是不能重读取的,消费了就消费了。
     */
    default boolean isOpen() {
        return false;
    }

    /**
     * 判断指定的源是否是个文件系统中的文件
     */
    default boolean isFile() {
        return false;
    }

    /**
     * 返回处理这个源的 URL
     *
     */
    URL getURL() throws IOException;

    /**
     * 返回处理这个源的 URI 【也不知道有啥区别】
     */
    URI getURI() throws IOException;

    /**
     * 
     */
    File getFile() throws IOException;

    /**
     * 用 ReadableByteChannel 包裹了一下 getInputStream() ,算是增强了。
     */
    default ReadableByteChannel readableChannel() throws IOException {
        return Channels.newChannel(getInputStream());
    }

    /**
     * 获得源的长度
     */
    long contentLength() throws IOException;

    /**
     * 
     */
    long lastModified() throws IOException;

    /**
     * 以当前源的路径为标准创建一个相对路径的 Resource
     */
    Resource createRelative(String relativePath) throws IOException;

    /**
     * 
     */
    @Nullable
    String getFilename();

    /**
     * 
     */
    String getDescription();

}
上一篇下一篇

猜你喜欢

热点阅读