Spring 中的 Resource和ResourceLoader

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 揭祕》。

相關文章
相關標籤/搜索