zoukankan      html  css  js  c++  java
  • Spring 资源文件处理

    Java中,不同来源的资源抽象成URL,通过注册不同的handler(URLStreamHandler)来处理不同来源的资源的读取逻辑。一般handler的类型使用不同的前缀(协议,protocal)来识别,如:“file:”、“http:“、”jar:”等。
     
    对于Spring,URL没有定义相应的,如“classpath:“的handler,定义也相对麻烦,Spring对配置文件的读取做了相应的封装,通过Resource接口来抽象底层资源。如下:
    /**
     * 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.
     *
     * @author Juergen Hoeller
     * @since 28.12.2003
     * @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 {
    
        /**
         * Return whether this resource actually exists in physical form.
         * <p>This method performs a definitive existence check, whereas the
         * existence of a {@code Resource} handle only guarantees a
         * valid descriptor handle.
         */
        boolean exists();
    
        /**
         * Return whether the contents of this resource can be read,
         * e.g. via {@link #getInputStream()} or {@link #getFile()}.
         * <p>Will be {@code true} for typical resource descriptors;
         * note that actual content reading may still fail when attempted.
         * However, a value of {@code false} is a definitive indication
         * that the resource content cannot be read.
         * @see #getInputStream()
         */
        boolean isReadable();
    
        /**
         * Return whether this resource represents a handle with an open
         * stream. If true, the InputStream cannot be read multiple times,
         * and must be read and closed to avoid resource leaks.
         * <p>Will be {@code false} for typical resource descriptors.
         */
        boolean isOpen();
    
        /**
         * Return a URL handle for this resource.
         * @throws IOException if the resource cannot be resolved as URL,
         * i.e. if the resource is not available as descriptor
         */
        URL getURL() throws IOException;
    
        /**
         * Return a URI handle for this resource.
         * @throws IOException if the resource cannot be resolved as URI,
         * i.e. if the resource is not available as descriptor
         */
        URI getURI() throws IOException;
    
        /**
         * Return a File handle for this resource.
         * @throws IOException if the resource cannot be resolved as absolute
         * file path, i.e. if the resource is not available in a file system
         */
        File getFile() throws IOException;
    
        /**
         * Determine the content length for this resource.
         * @throws IOException if the resource cannot be resolved
         * (in the file system or as some other known physical resource type)
         */
        long contentLength() throws IOException;
    
        /**
         * Determine the last-modified timestamp for this resource.
         * @throws IOException if the resource cannot be resolved
         * (in the file system or as some other known physical resource type)
         */
        long lastModified() throws IOException;
    
        /**
         * Create a resource relative to this resource.
         * @param relativePath the relative path (relative to this resource)
         * @return the resource handle for the relative resource
         * @throws IOException if the relative resource cannot be determined
         */
        Resource createRelative(String relativePath) throws IOException;
    
        /**
         * Determine a filename for this resource, i.e. typically the last
         * part of the path: for example, "myfile.txt".
         * <p>Returns {@code null} if this type of resource does not
         * have a filename.
         */
        String getFilename();
    
        /**
         * Return a description for this resource,
         * to be used for error output when working with the resource.
         * <p>Implementations are also encouraged to return this value
         * from their {@code toString} method.
         * @see Object#toString()
         */
        String getDescription();
    
    }

    对于不同来源的资源文件都有相应的Resource实现:

        1. 文件(FileSystemResource)

        2. Classpath资源(ClassPathResource)

        3. URL资源(UrlResource)

        4. InputStream资源(InputStreamResource)

        5. Byte数组资源(ByteArrayResource)等。

    ClassPathResource实现:

    this.class.getResourceAsStream(this.path);

    FileSystemResource实现:

    new FileInputStream(this.file);
    ... ...
     
    Resource实现返回InputStream,后续由XmlBeanDefinitionReader进行操作,如下:
     
    配置文件加载流程
    ResourceLoader:资源加载器,根据资源地址返回Resource。EncodedResource封装(处理编码)
            ↓↓
            ↓↓委托
            ↓↓
    DocumentLoader(DefaultDocumentLoader):转换Resource为Document。SAX读取XML文件获取InputStream构造解析InputSource返回Documet。
            ↓↓
            ↓↓
            ↓↓
    BeanDefinitionDocumentReader(DefaultBeanDefinitionDocumentReader)(单一职责应用):解析Document,注册bean。registerBeanDefinitions(doRegisterBeanDefinitions)

      

    DefaultBeanDefinitionDocumentReader:包含preXmlProcess和postXmlProcess两个空的模板方法,供子类做相应处理。
     
  • 相关阅读:
    UWP Composition API
    UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二)
    UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一)
    UWP 图片剪切旋转工具
    整理UWP中网络和设备信息获取的帮助类,需要的拿走。
    UWP 设备分辨率
    UWP webview 键盘bug,回退页面,键盘会弹一下。
    UWP 解决Webview在Pivot里面无法左右滑动的问题
    ngnix https
    nginx www解析失败问题解决
  • 原文地址:https://www.cnblogs.com/niejunlei/p/6047999.html
Copyright © 2011-2022 走看看