Spring 资源文件处理
发布日期:2021-05-09 05:38:09 浏览次数:25 分类:博客文章

本文共 4795 字,大约阅读时间需要 15 分钟。

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. * * 

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. *

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()}. *

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. *

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". *

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. *

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两个空的模板方法,供子类做相应处理。
 
上一篇:Spring profile配置应用
下一篇:JAVA NIO Socket通道

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月24日 23时15分47秒