Resource体系学习

来源:互联网 发布:数据统计方法有哪些 编辑:程序博客网 时间:2024/06/14 16:40

图稍后附.

Resource体系是spring框架中负责资源加载的模块.

一.根接口

1.InputStreamSource接口

该接口是从流当中获取对象的最简单的接口,是spring最具扩展性的基础接口.
对于单一用途的流来说,该接口可以被应用于任何给定的输入流.spring的ByteArrayResource或者其他任何的基于文件的Resource实现都可以作为一个明确的实例来使用.允许一个实例对内容流多次读.

2. Resource接口

该接口可以将实际的资源类型(例如一个文件或者一个类资源的路径)当中将资源抽象出来.
如果一个资源以物理形式存在的话,对于每个资源都可以打开一个输入流,对于特定的某些资源,只能返回一个URL或者是文件句柄.接口实际的行为取决于特定的实现.
Resource接口有三个子接口,如下:
1. ContextResource接口:该接口载入了一个封闭的上下文.例如servletContext或者PortleContext,也包括普通的类路径或者相关的文件系统路径(特别是对没有明确的prefix,因此会应用本地ResourceLoader的上下文).
源码如下:

public interface ContextResource extends Resource {    /**     * Return the path within the enclosing 'context'.     * <p>This is typically path relative to a context-specific root directory,     * e.g. a ServletContext root or a PortletContext root.     */    String getPathWithinContext();}

可以看到只有一个方法用于提供上下文的路径
2. EncodedResource接口:该接口用于描述整个资源内容的编码.如果客户端强烈需要额外的解码能力来检索资源内容,此时该接口提供的信息就会很有用了.
3. WritableResource接口:支持写资源的接口,提供了输出流的访问器.

可以看到,spring对于不同的需求,都指定了不同的接口用来支持.

下面对体系图中的各个类和接口的用途加以说明,基本上都属于源码中注释的翻译.

  1. AbstractSource抽象类:
    该类是Resource接口的一个预实现.
    主要来检测资源是否存在.
  2. DescriptiveResource类: 持有一个资源的描述,但实际上并不会指向一个可读的资源.
  3. 还有一些其他的类,例如ByteArrayResource,FileSystemResource类等,从类名字可以看出来都是针对不同形式的资源.
  4. AbstractFielResolvingResource抽象类:
    该类主要把URL解析到文件的引用.例如UrlResource or ClassPathResource.在URL中检测file和vfs协议,解析文件系统的引用.下面分析他的4个实现类.
    4.1 ClassPathResource类:针对类路径资源的一个实现类,使用给定的类加载器或者给定的类来加载资源.如果类路径存在于文件系统中,支持File类,但是不支持JAR形式的资源.对于URL类型的资源总是提供支持.
    4.2 ServletContextResource类: 针对ServletContext类型的资源实现.在web应用根目录中解释相关的路径.始终支持流访问和URL访问,但仅当扩展Web应用程序存档时才允许访问java.io.File。
    4.3 UrlResource类:针对URL定位器的实现,支持URL访问,在file:协议下,也支持文件的访问.
原创粉丝点击