当前位置: 首页 > news >正文

Spring中的资源加载策略

文/杜琪(简书作者)
原文链接:http://www.jianshu.com/p/9cdd6d750216
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

本文是阅读《Spring揭秘》的笔记


资源表示:ResourceSpring框架内部使用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实现类,比较少用。



资源加载:ResourceLoader在Spring框架中,ResourceLoader是资源查找定位策略的统一抽象,具体的资源查找定位策略由相应的ResourceLoader实现类给出。ResouceLoader的定义如下:
public interface ResourceLoader {
 String CLASSPATH_URL_PREFIX = "classpath:";
 Resource getResource(String var1);
 ClassLoader getClassLoader();
}


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


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

Resource和Resource Loader层次图

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

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

相关文章:

  • 你知道迭代器 Iterator 是什么吗?
  • 什么是乐观锁、什么是悲观锁,两种锁在Java中的具体应用场景有哪些
  • Error: Out of memory! attempting SFTP connectio
  • 谈一谈session和cookie的区别,以及session的实现机制
  • Android--activity获取返回值
  • 你能说出四种创建线程的方式吗?
  • IOS 多线程01-线程基础知识
  • 说一下runnable 和 callable 有什么区别?Future是什么?
  • Spring MVC 3.0 深入及对注解的详细讲解
  • 线程的 run()和 start()有什么区别?sleep() 和 wait() 有什么区别?
  • 你对线程池的了解有多少?知道为什么阿里不让用Java提供的线程池吗?
  • Android音频底层调试-基于tinyalsa
  • 关于Java多线程锁的升级原理,这篇文章会让你另有收获
  • 关于动态代理,你能说出动态代理的几种方式?
  • WebKit 源码分析 -- loader
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • angular组件开发
  • css选择器
  • ES6简单总结(搭配简单的讲解和小案例)
  • go语言学习初探(一)
  • JavaScript新鲜事·第5期
  • storm drpc实例
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 从0到1:PostCSS 插件开发最佳实践
  • 关于List、List?、ListObject的区别
  • 基于axios的vue插件,让http请求更简单
  • 面试总结JavaScript篇
  • 如何用vue打造一个移动端音乐播放器
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 智能网联汽车信息安全
  • Java总结 - String - 这篇请使劲喷我
  • 湖北分布式智能数据采集方法有哪些?
  • 说说我为什么看好Spring Cloud Alibaba
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • ###STL(标准模板库)
  • #git 撤消对文件的更改
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (小白学Java)Java简介和基本配置
  • (转)Google的Objective-C编码规范
  • (转载)从 Java 代码到 Java 堆
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET : 在VS2008中计算代码度量值
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .pyc文件是什么?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [.NET]桃源网络硬盘 v7.4