Spring 内部框架使用org.springframework.core.io.Resource接口做为全部资源的抽象和访问接口。Resource接口能够根据资源的不一样类型,或者资源所处的不一样场合,给出相应的具体实现。Spring 框架在这个理念的基础上,提供了一些实现类(能够在org.springframework.core.io包下找到这些实现类):ByteArrayResource、ClassPathResource、FileSystemResource、UrlResource... ...spring
若是以上这些资源实现还不能知足需求,那么咱们还能够根据相应的场景给出本身的实现,只需实现org.springframework.core.io.Resource接口就是了。更加简便的方法是继承org.springframework.core.io.AbstractResource抽象类,而后根据当前具体资源特征,覆盖相应的方法就能够了。框架
org.springframework.core.io.ResourceLoader接口是资源查找定位策略的统一抽象,具体的资源查找定位策略则由相应的ResourceLoader实现类给出。spa
ResourceLoader有一个默认的实现类,即org.springframework.core.io.DefaultResourceLoader,该类默认的资源查找处理逻辑以下:code
(1)首先检查资源路径是否以classpath:前缀打头,若是是,则尝试构造ClassPathResource类型资源并返回。orm
(2)不然,(a)尝试经过URL,根据资源路径来定位资源,若是没有抛出MalformedURLException,则会构造UrlResource类型的资源并返回;(b)若是仍是没法根据资源路径定位指定的资源,则委派getResourceByPath(String)方法来定位,DefaultResourceLoader的getResourceByPath(String)默认实现逻辑是,构造ClassPathResource类型的资源并返回。blog
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数量上的差别。get
本文节选自《Spring 揭秘》。