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实现类,比较少用。
  2. 资源加载:ResourceLoader
    在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。ResouceLoader的定义如下:

    public interface ResourceLoader {
     String CLASSPATH_URL_PREFIX = "classpath:";
     Resource getResource(String var1);
     ClassLoader getClassLoader();
    }
  3. 批量加载资源:ResourcePatternResolver

    public interface ResourcePatternResolver extends ResourceLoader {
     String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
     Resource[] getResources(String var1) throws IOException;
    }

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

1240
Resource和Resource Loader层次图

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

1240
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来做。

1240
AbstractApplicationContext和ResourceLoader、ResourcePatternResolver的关系

目录
相关文章
|
3月前
|
安全 Java Spring
Spring Security OAuth 资源服务器认证浅析
【1月更文挑战第18天】之前的几篇文章介绍了如何进行用户认证并向客户端分发 Token,以及 Token 是如何生成的,这篇分析一下,当客户端拿着 Token 去访问资源的时候,资源服务器是如何验证 Token 是否合法的。
51 2
|
4月前
|
Java 数据库 Spring
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
48 1
|
5月前
|
缓存 安全 算法
Spring Security OAuth 2.0 资源服务器— JWT
Spring Security OAuth 2.0 资源服务器— JWT
230 1
|
2月前
|
存储 Java Maven
SpringCloud Oauth2.0 实现资源验证
SpringCloud Oauth2.0 实现资源验证
34 0
|
3月前
|
前端开发 Java Spring
Spring5源码(14)-Spring资源文件读取
Spring5源码(14)-Spring资源文件读取
25 1
|
3月前
|
XML Java 数据格式
spring之资源操作:Resources
【1月更文挑战第17天】 一、Spring Resources概述 二、Resource接口 三、Resource的实现类 1、UrlResource访问网络资源 2、ClassPathResource 访问类路径下资源 3、FileSystemResource 访问文件系统资源 4、ServletContextResource 5、InputStreamResource 6、ByteArrayResource 四、Resource类图 五、ResourceLoader 接口 1、ResourceLoader 概述 2、使用演示 3、ResourceLoader 总结 六、ResourceLo
73 1
|
3月前
|
XML Java 数据格式
Spring Resources资源操作
Spring Resources资源操作
|
5月前
|
设计模式 Java API
使用Spring框架创建一个RESTful API,实现学生信息的管理,包括资源的创建、读取、更新和删除。
在当今的Web应用程序开发中,RESTful API(Representational State Transferful Application Programming Interface)变得越来越重要。Spring框架提供了强大的工具和功能,以便轻松创建、读取、更新和删除(CRUD)资源。在这篇文章中,我们将深入探讨如何使用Spring框架创建一个RESTful API,并通过一个完整的示例演示。
|
5月前
|
存储 Java Spring
Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用
使用 Resource 加载资源 要使用 Resource 接口加载资源,首先需要获取一个 ResourceLoader 实例,通常可以通过依赖注入来获得。接下来,您可以使用 ResourceLoader 来获取 Resource 对象,然后使用它来访问资源的内容。
|
6月前
|
Java Go 数据安全/隐私保护
Spring Boot项目在Windows上的自启动策略与Windows自动登录配置
Spring Boot项目在Windows上的自启动策略与Windows自动登录配置
79 0