Spring 中的 Resource和ResourceLoader
Spring 内部框架使用org.springframework.core.io.Resource接口作为所有资源的抽象和访问接口。Resource接口可以根据资源的不同类型,或者资源所处的不同场合,给出相应的具体实现。Spring 框架在这个理念的基础上,提供了一些实现类(可以在org.springframework.core.io包下找到这些实现类):ByteArrayResource、ClassPathResource、FileSystemResource、UrlResource... ...
如果以上这些资源实现还不能满足需求,那么我们还可以根据相应的场景给出自己的实现,只需实现org.springframework.core.io.Resource接口就是了。更加简便的方法是继承org.springframework.core.io.AbstractResource抽象类,然后根据当前具体资源特征,覆盖相应的方法就可以了。
org.springframework.core.io.ResourceLoader接口是资源查找定位策略的统一抽象,具体的资源查找定位策略则由相应的ResourceLoader实现类给出。
ResourceLoader有一个默认的实现类,即org.springframework.core.io.DefaultResourceLoader,该类默认的资源查找处理逻辑如下:
(1)首先检查资源路径是否以classpath:前缀打头,如果是,则尝试构造ClassPathResource类型资源并返回。
(2)否则,(a)尝试通过URL,根据资源路径来定位资源,如果没有抛出MalformedURLException,则会构造UrlResource类型的资源并返回;(b)如果还是无法根据资源路径定位指定的资源,则委派getResourceByPath(String)方法来定位,DefaultResourceLoader的getResourceByPath(String)默认实现逻辑是,构造ClassPathResource类型的资源并返回。
ResourcePatternResolver是ResourceLoader的扩展,ResourceLoader每次只能根据资源路径返回确定的单个Resource实例,而ResourcePatternResolver则可以根据指定的资源路径匹配模式,每次返回多个Resource实例。接口org.springframework.core.io.support.ResourcePatternResolver定义如下:
public interface ResourcePatternResolver extends ResourceLoader {
    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
    Resource[] getResources(String locationPattern) throws IOException;
}
ResourcePatternResolver在继承ResourceLoader原有定义的基础上,又引入了Resource[] getResources(String)方法定义,以支持根据路径匹配模式返回多个Resource的功能。它同时还引入了一种新的协议前缀classpath*:,针对这一点的支持,将由相应的子类实现给出。
ResourcePatternResolver最常用的一个实现是org.springframework.core.io.support.PathMatchingResourcePatternResolver,该实现类支持ResourceLoader级别的资源加载,支持基于Ant风格的路径匹配模式(类似于**/*.suffix之类的路径形式),支持ResourcePatternResolver新增加的classpath*:前缀等,基本上集所有技能于一身。
在构造PathMatchingResourcePatternResolver实例的时候,可以指定一个ResourceLoader,如果不指定的话,则PathMathingResorcePatternResolver内部会默认构造一个DefaultResourceLoader实例。PathMatchingResourcePatternResolver内部会将匹配后确定的资源路径,委派给它的ResourceLoader来查找和定位资源。这样,如果不指定任何ResourceLoader的话,PathMatchingResourcePatternResolver在加载资源的行为上会与DefaultResourceLoader基本相同,只存在返回的Resource数量上的差异。
本文节选自《Spring 揭秘》。
Spring 中的 Resource和ResourceLoader的更多相关文章
- Spring中的Resource
		
Spring中的资源定义:Resource此接口的全名为:org.springframework.core.io.Resource比较常用的资源定义的实现类为:1.ClassPathResource ...
 - 2:spring中的@resource
		
@Resource 其实是spring里面的注解注入. @Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段 ...
 - spring中注解@Resource 与@Autowire 区别
		
① .@Resource 是根据名字进行自动装配:@Autowire是通过类型进行装配. ②. @Resource 注解是 jdk 的:@Autowire 是spring的.
 - Spring中的Autowired注解和Resource注解的区别
		
1.所属jar包不同,Autowired是Spring中的Resource是JSR-250规范定义的注解
 - Spring中资源的加载原来是这么一回事啊!
		
1. 简介 在JDK中 java.net.URL 适用于加载资源的类,但是 URL 的实现类都是访问网络资源的,并没有可以从类路径或者相对路径获取文件及 ServletContext , 虽然可以通过 ...
 - Spring中@Autowired注解、@Resource注解的区别 (zz)
		
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
 - Spring中Autowired注解,Resource注解和xml default-autowire工作方式异同
		
前面说到了关于在xml中有提供default-autowire的配置信息,从spring 2.5开始,spring又提供了一个Autowired以及javaEE中标准的Resource注释,都好像可以 ...
 - Spring中@Autowired、@Resource和@Inject注解的使用和区别
		
在使用Spring进行项目开发的时候,会大量使用到自动装配,那自动装配是什么呢?简单来说:Spring 利用依赖注入(DI)功能,完成SpringIOC容器中各个组件之间的依赖关系赋值管理. 下面介绍 ...
 - Spring中 @Autowired注解与J2EE@Resource注解的区别
		
在开发中经常使用到@Autowired和@Resource进行装配. 不禁好奇这两个注解的差异在何处??? 相同点: @Resource的作用相当于@Autowired,均可标注在字段或属性的sett ...
 
随机推荐
- hive操作记录
			
hive是依赖于hdfs和yarn的一个数据仓库 数据库和数据仓库的区别: 数据库在存储数据的同时,允许实时的增删改查等操作 数据仓库在存储数据的同时还执行着计算和分析数据的工作,但是并不能实时的进行 ...
 - [TypeScript] Use the TypeScript "unknown" type to avoid runtime errors
			
The "any" type can be very useful, especially when adding types to an existing JavaScript ...
 - [Javascript] Conditionally spread entries to a JavaScript object
			
In JavaScript, we often end up composing one object out of several other objects. Luckily there's a ...
 - EffectiveJava(23)为什么不能在新生代码中使用原生态类型
			
泛型类和泛型接口 声明一个或者多个类型参数的类或者接口. 为什么不要在新代码中使用原生态类型 原生态类型,即泛型不带参数的类型 如List的list,list就是其原生态类型 1.使用原生态类型,插入 ...
 - Activemq消息确认机制  --转载
			
转自:http://blog.csdn.net/czp11210/article/details/47022639 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存 ...
 - 右键添加在siblime中打开选项
			
siblime text安装完成之后没有右键打开的快捷方式,对于开发者来说每次用siblime打开文件比较繁琐. 下面教程可以让大家解决这个问题 首先点击开始--运行,输入regedit,(win7系 ...
 - IE 页面不正常显示 错误脚本不报错 脚本调试相关
			
在开发时,有时自己做的页面上的JS有错误,但是IE浏览器并不报错,这个时候有可能是因为脚本调试被禁止了. 在Internet选项的高级里面有 两个禁止脚本调试选项,把他们去掉就行.
 - java学习路线-Java技术人员之路从0基础到高级
			
满满的 全是干货 java基础: 尚学堂 马士兵 个人推荐 历经5年锤练--史上最适合刚開始学习的人入门的Java基础视频 很具体 适合 时间多的看 传智播客java基础班 马士兵线程 ...
 - <转>巧用notepad++ 批量转换ansi 和 utf8
			
原方出处:http://stackoverflow.com/questions/7256049/notepad-converting-ansi-encoded-file-to-utf-8 Here s ...
 - H5网站模板——前台和后台
			
以下是比较典型的前台或者后台的H5模板: html5优分期大学生分期购物商城模板链接:http://pan.baidu.com/s/1dEUAzBz 密码:j150 红色的五金电气商城网站模板链接:h ...