文档章节

Spring IOC 之统一资源加载策略

Java搬砖工程师
 Java搬砖工程师
发布于 2018/10/19 10:24
字数 1088
阅读 12
收藏 0

统一资源:Resource
 

  • org.springframework.core.io.Resource 为 Spring 框架所有资源的抽象和访问接口
    • 它继承 org.springframework.core.io.InputStreamSource接口
    • 作为所有资源的统一抽象,Source 定义了一些通用的方法,由子类 AbstractResource 提供统一的默认实现

  • FileSystemResource:对 java.io.File 类型资源的封装,只要是跟 File 打交道的,基本上与 FileSystemResource 也可以打交道。支持文件和 URL 的形式,实现 WritableResource 接口,且从 Spring Framework 5.0 开始,FileSystemResource 使用NIO.2 API进行读/写交互
  • ByteArrayResource:对字节数组提供的数据的封装。如果通过 InputStream 形式访问该类型的资源,该实现会根据字节数组的数据构造一个相应的 ByteArrayInputStream。
  • UrlResource:对 java.net.URL类型资源的封装。内部委派 URL 进行具体的资源操作。
  • ClassPathResource:class path 类型资源的实现。使用给定的 ClassLoader 或者给定的 Class 来加载资源。
  • InputStreamResource:将给定的 InputStream 作为一种资源的 Resource 的实现类。  

统一资源定位:ResourceLoader

  • org.springframework.core.io.ResourceLoader 为 Spring 资源加载的统一抽象,具体的资源加载则由相应的实现类来完成
  • 所以我们可以将 ResourceLoader 称作为统一资源定位器
  • 该方法的主要实现是在其子类 DefaultResourceLoader 中实现
  • ResourceLoader 接口提供两个方法:getResource()getClassLoader()
  • getResource() 方法支持以下模式的资源加载:
    • URL位置资源,如”file:C:/test.dat”
    • ClassPath位置资源,如”classpath:test.dat”
    • 相对路径资源,如”WEB-INF/test.dat”,此时返回的Resource实例根据实现不同而不同

DefaultResourceLoader

  • DefaultResourceLoader 是 ResourceLoader 的默认实现
  • 首先通过 ProtocolResolver 来加载资源,成功返回 Resource,否则调用如下逻辑:
    • 若 location 以 / 开头,则调用 getResourceByPath()构造 ClassPathContextResource 类型资源并返回
    • 若 location 以 classpath: 开头,则构造 ClassPathResource 类型资源并返回,在构造该资源时,通过 getClassLoader()获取当前的 ClassLoader
    • 构造 URL ,尝试通过它进行资源定位,若没有抛出 MalformedURLException 异常,则判断是否为 FileURL , 如果是则构造 FileUrlResource 类型资源,否则构造 UrlResource。若在加载过程中抛出 MalformedURLException 异常,则委派 getResourceByPath() 实现资源定位加载
  • ProtocolResolver ,用户自定义协议资源解决策略,作为 DefaultResourceLoader 的 SPI,它允许用户自定义资源加载协议,而不需要继承 ResourceLoader 的子类

FileSystemResourceLoader

  • FileSystemContextResource 为 FileSystemResourceLoader 的内部类,它继承 FileSystemResource

ResourcePatternResolver

  • ResourcePatternResolver 是 ResourceLoader 的扩展,它支持根据指定的资源路径匹配模式每次返回多个 Resource 实例
  • ResourcePatternResolver 新增的 classpath*: 前缀外,还支持 Ant 风格的路径匹配模式(类似于 **/*.xml
  • PathMatchingResourcePatternResolver 在实例化的时候,可以指定一个 ResourceLoader,如果不指定的话,它会在内部构造一个 DefaultResourceLoader

  • Resource[] getResources(String locationPattern) 方法处理逻辑:

  • protected Resource[] findPathMatchingResources(String locationPattern)
  • 主要分两步:

    • 确定目录,获取该目录下得所有资源

    • 在所获得的所有资源中进行迭代匹配获取我们想要的资源。

我们要关注两个方法,一个是 determineRootDir(),一个是 doFindPathMatchingFileResources()

  • determineRootDir()主要是用于确定根路径

下面简要总结下:

  • Spring 提供了 Resource 和 ResourceLoader 来统一抽象整个资源及其定位。使得资源与资源的定位有了一个更加清晰的界限,并且提供了合适的 Default 类,使得自定义实现更加方便和清晰
  • DefaultResource 为 Resource 的默认实现,它对 Resource 接口做了一个统一的实现,子类继承该类后只需要覆盖相应的方法即可,同时对于自定义的 Resource 我们也是继承该类
  • DefaultResourceLoader 同样也是 ResourceLoader 的默认实现,在自定 ResourceLoader 的时候我们除了可以继承该类外还可以实现 ProtocolResolver 接口来实现自定资源加载协议
  • DefaultResourceLoader 每次只能返回单一的资源,所以 Spring 针对这个提供了另外一个接口 ResourcePatternResolver ,该接口提供了根据指定的 locationPattern 返回多个资源的策略。其子类 PathMatchingResourcePatternResolver 是一个集大成者的 ResourceLoader ,因为它即实现了 Resource getResource(String location) 也实现了 Resource[] getResources(String locationPattern)

© 著作权归作者所有

共有 人打赏支持
Java搬砖工程师
粉丝 30
博文 348
码字总数 242017
作品 0
南京
程序员
私信 提问
【死磕 Spring】—– IOC 之 IOC 初始化总结

原文出自:http://cmsblogs.com 前面 13 篇博文从源码层次分析了 IOC 整个初始化过程,这篇就这些内容做一个总结将其连贯起来。 在前文提过,IOC 容器的初始化过程分为三步骤:Resource 定位...

chenssy
2018/10/09
0
0
【死磕 Spring】—– IOC 之 加载 Bean

原文出自:http://cmsblogs.com 先看一段熟悉的代码: 这段代码是 Spring 中编程式使用 IOC 容器,通过这四段简单的代码,我们可以初步判断 IOC 容器的使用过程。 获取资源 获取 BeanFactor...

chenssy
2018/09/07
0
0
【死磕 Spring】----- IOC 之 加载 Bean

版权声明:版权声明:转载前请留言获得作者许可,转载后标明作者 chenssy 和原文出处。原创不易,感谢您的支持 https://blog.csdn.net/chenssy/article/details/82494923 原文出自:http://...

chenssy
2018/09/07
0
0
【死磕 Spring】—– IOC 之 Spring 统一资源加载策略

原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 ,该类在 Java SE 中的定位为统一资源定位器(Uniform Resource Locator),但是我们知道它的实现基本只限于网络形...

chenssy
2018/09/05
0
0
【死磕 Spring】----- IOC 之 Spring 统一资源加载策略

版权声明:版权声明:转载前请留言获得作者许可,转载后标明作者 chenssy 和原文出处。原创不易,感谢您的支持 https://blog.csdn.net/chenssy/article/details/82413763 原文出自:http://...

chenssy
2018/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

layui弹窗滑动问题

问题:弹窗之后,父窗口总是滑动到顶部 思路:使用锚点的机制,实现关闭弹窗后滑动到锚点 ,end:function(){ ... if (location.hash== hash) { location.hash = ''; }...

关元
17分钟前
0
0
presto函数

CASE CASE expression WHEN value THEN result [ WHEN ... ] [ ELSE result ]ENDSELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 't......

hutaishi
25分钟前
0
0
.git目录瘦身

瘦身过程如下: 1.复制两个最新版本 git clone ssh://git@host:port/project.git dir1/project dir2/project 2.对dir1目录的工程进行瘦身 删除所有非python文件以及其记录,并提交. git filte...

legend3
29分钟前
1
0
Debian pip3 ImportError: cannot import name 'IncompleteRead'错误解决

突然pip3不能正常使用了, 执行pip3 -V报错为如下: 瞬间崩溃,翻阅一些资料给出的解决方案均是 easy_install3 -U pip3 修复,试后仍然无法解决,随换另一种方法,重新安装pip3: apt-get re...

Sunki
30分钟前
2
0
Springboot Failed to parse configuration class [x]; nested exception

1.前言 在使用Springboot时,我们偶尔会单独引用一些特定的properties文件,在引用这些文件时,我们就应用到了注解:@PropertySource。 2.分析错误信息 Caused by: org.springframework.bea...

hengbao5
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部