Spring中的资源加载策略

本文是阅读《Spring揭秘》的笔记

  1. 资源表示:Resource Spring框架内部使用org.springframework.core.io.Resouce接口作为所有资源的抽象和访问接口。
//Resource接口的定义
public interface Resource extends InputStreamSource {
    boolean exists();
    boolean isReadable();
    boolean isOpen();
    URL getURL() throws IOException;
    URI getURI() throws IOException;
    File getFile() throws IOException;
    long contentLength() throws IOException;
    long lastModified() throws IOException;
    Resource createRelative(String var1) throws IOException;
    String getFilename();
    String getDescription();
}

Resouce接口可以根据资源的不同类型,或者资源位置的不同,给出对应的具体实现,Spring框架提供了一些实现类:

  • ByteArrayResource。将字节数组作为资源进行封装,如果通过InputStream形式访问该类型的资源,该实现会根据字节数组的数据,构造出对应的ByteArrayInputStream并返回。
  • ClassPathResource。从Java应用的classpath中加载具体的资源并封装,可以使用指定的类加载器或者给定的类进行资源加载。
  • FileSystemResource。可以以文件或者URL的形式对该资源进行访问,只要能跟File打的交道,基本上跟FileSystemResource也可以。
  • UrlResource。通过java.net.URL进行具体资源查找定位的实现类。
  • InputStreamResource。将给定的InputStream视为一种资源的Resource实现类,比较少用。
  1. 资源加载:ResourceLoader 在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。ResouceLoader的定义如下:
public interface ResourceLoader {
    String CLASSPATH_URL_PREFIX = "classpath:";
    Resource getResource(String var1);
    ClassLoader getClassLoader();
}
  1. 批量加载资源:ResourcePatternResolver
public interface ResourcePatternResolver extends ResourceLoader {
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
    Resource[] getResources(String var1) throws IOException;
}

最后,可以用一张图表示Spring的统一资源加载策略,如下图所示:

Resource和Resource Loader层次图

回过头来,再看下BeanFactory和ApplicationContext的继承关系图:

BeanFactory和ApplicationContext的继承关系图

ApplicationContext继承了ResourcePatternResolver,当然就间接实现了ResourceLoader接口。所以,任何的ApplicationContext实现都可以看作是一个ResourceLoader甚至ResourcePatternResolver。而这就是ApplicationContext支持Spring内统一资源加载策略的真相。

通常,所有的ApplicationContext实现类会直接或者间接地继承org.springframework.context.support.AbstractApplicationContext,从这个类上,我们就可以看到Application-Context与ResourceLoader之间的所有关系。AbstractApplicationContext继承了DefaultRe-sourceLoader,那么,它的getResource(String)当然就直接用DefaultResourceLoader的了。

剩下需要它“效劳”的,就是ResourcePatternResolver的Resource[]getResources (String),当然,AbstractApplicationContext也不负众望,当即拿下。AbstractApplicationContext类的内部声明有一个resourcePatternResolver,类型是ResourcePatternResolver,对应的实例类型为PathMatchingResourcePatternResolver 。

之前我们说过PathMatchingResourcePattern-Resolver构造的时候会接受一个ResourceLoader,而AbstractApplicationContext本身又继承自DefaultResourceLoader,当然就直接把自身给“贡献”了。这样,整个ApplicationContext的实现类就完全可以支持ResourceLoader或者ResourcePatternResolver接口,你能说Application-Context不支持Spring的统一资源加载吗?说白了,ApplicationContext的实现类在作为ResourceLoader或者ResourcePatternResolver时候的行为,完全就是委派给了PathMatchingResource-PatternResolver和DefaultResourceLoader来做。

AbstractApplicationContext和ResourceLoader、ResourcePatternResolver的关系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏郭霖

Android图片加载框架最全解析(四),玩转Glide的回调与监听

大家好,今天我们继续学习Glide。 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓...

5836
来自专栏与神兽党一起成长

jFinal路由解析源码分析

jFinal的路由解析是在JFinalFilter中做的,这个Filter也需要在web.xml中配置。JFinalFilter实现了javax.servlet...

1582
来自专栏Java编程技术

Velocity引擎原理探究

常见的Java模板引擎有JSP、Freemark,Velocity。在MVC三层框架中,模板引擎属于view层,实质是把model层内容展现到前台页面的一个引擎...

1522
来自专栏一枝花算不算浪漫

[Java 缓存] Java Cache之 Guava Cache的简单应用.

3986
来自专栏coding

实例讲解redis的hash散列类型

952
来自专栏技术之路

Caliburn.Micro学习笔记(五)----协同IResult

今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute...

2088
来自专栏hrscy

Alamofire 上传图片入门教程(下)

在 ViewController 的 extension 里面,uploadImage(_:progress:completion:) 的下面添加如下的代码:

2692
来自专栏androidBlog

一步步拆解 LeakCanary

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

891
来自专栏JackieZheng

照虎画猫写自己的Spring

从细节跳出来 看了部分Spring的代码,前面用了四篇内容写了一些读书笔记。 回想起来,论复杂度,Spring够喝上好几壶的。他就像一颗枝繁叶茂的大树,远处看...

1968
来自专栏chenssy

【死磕 Spring】----- IOC 之 Spring 统一资源加载策略

在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Resource ...

1613

扫码关注云+社区

领取腾讯云代金券