统一资源:Resource
java
- 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)
-
主要分两步:spring
-
肯定目录,获取该目录下得全部资源数组
- 在所得到的全部资源中进行迭代匹配获取咱们想要的资源。
咱们要关注两个方法,一个是 determineRootDir()
,一个是 doFindPathMatchingFileResources()
框架
determineRootDir()
主要是用于肯定根路径

下面简要总结下:spa
- 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)