天天看点

【Spring源码系列】IOC-Resource统一资源定义与加载

Resource接口为spring提供所有资源的顶层接口定义

AbstractResource为提供默认实现

FileSystemResource:可操作文件,URL,Spring5开始由NIO2实现具体操作

ByteArrayResource:对字节数组提供的数据的封装。

UrlResource

ClassPathResource:class path 类型资源的实现。

InputStreamResource :将给定的 InputStream 作为一种资源的 Resource 的实现类。

【Spring源码系列】IOC-Resource统一资源定义与加载
自定义Resource
继承AbstractResource,根据当前的具体资源特性覆盖相应的方法即可
Spring 资源加载的统一抽象ResourceLoader
DefaultResourceLoader
  • 扩展点:ProtocolResolver-自定义ResourceLoader实现
    • DefaultResourceLoader#addProtocolResolver(ProtocolResolver)
  • (1)通过 ProtocolResolver 来加载资源,成功返回 Resource
  • (2)location 以 “/” 开头,则构造 ClassPathContextResource 类型资源并返回
  • (3)若 location 以 “classpath:” 开头,则构造 ClassPathResource 类型资源并返回
  • (4)尝试构造 URL ,通过它进行资源定位,若没有则抛出 MalformedURLException 异常,返回ClassPathContextResource;否则

    (ResourceUtils.isFileURL(url) ? new FileUrlResource(url) : new UrlResource(url));

FileSystemResourceLoader

ClassRelativeResourceLoader: 可以根据给定的class 所在包或者所在包的子包下加载资源。

ResourcePatternResolver

  • 支持根据指定的资源路径匹配模式每次返回多个 Resource 实例
  • ResourcePatternResolver 在 ResourceLoader 的基础上增加了 #getResources(String locationPattern) 方法,以支持根据路径匹配模式返回多个 Resource 实例。
  • 同时,也新增了一种新的协议前缀 “classpath*:”,该协议前缀由其子类负责实现。
  • 常用子类: PathMatchingResourcePatternResolver 默认支持Ant路径匹配
【Spring源码系列】IOC-Resource统一资源定义与加载

继续阅读