[关闭]
@zhuanxu 2018-03-07T14:59:01.000000Z 字数 1045 阅读 1620

Attack-spring-boot-3-1: 统一资源定位

spring-boot


Spring提出了一套基于 org.springframework.core.io.Resource和 org.springframework.core.io.ResourceLoader接口的资源抽象和加载策略。

一个Resource的类图,其中 Resource 接口作为所有资源的抽象和访问接口

上图中列出的ClassPathResource,该实现从Java应用程序的ClassPath中加载具体资源并进行封装,可以使 用指定的类加载器(ClassLoader)或者给定的类进行资源加载。

我们来看Resource的接口定义:

通过这些方法,我们可以查询资源状态、访问资源内容,根据当前资源创建新的相对资源。如果我们想实现自己的Resource,只要继承自AbstractResource,实现自己关注的方法即可。

有了资源后,下一步就是去查找和定位这些资源了,这就到了 ResourceLoader。

ResourceLoader 最重要的方法是 Resource getResource(String location) 我们可以根据位置返回Resource。

DefaultResourceLoader 是 ResourceLoader 的默认实现,重点看 getResource 的逻辑:

  1. 先执行用户自定义的解析策略(策略外部注入)
  2. 如果没有匹配策略,则按”/“,”classpath:“,依次检查是否满足
  3. 最后以URL尝试载入
  4. 如果都不成功,则默认以ClassPathContextResource返回

看完 ResourceLoader 我们再看 ResourcePatternResolver,在 ResourceLoader 基础上新增了批量查找功能,ResourceLoader每次只能根据资源路径 返回确定的单个Resource实例,而ResourcePatternResolver则可以根据指定的资源路径匹配模式, 每次返回多个 Resource实例。

ResourcePatternResolver 最常用的一个实现是 PathMatchingResourcePatternResolver,该实现类支持ResourceLoader级别的资源加载,支持基 于Ant风格的路径匹配模式(类似于**/*.suffix之类的路径形式),支持ResourcePatternResolver新 增加的classpath*:前缀等,基本上集所有技能于一身。

下面是整个的类图

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注