統一資源:Resource
java
- org.springframework.core.io.Resource 爲 Spring 框架全部資源的抽象和訪問接口
- 它繼承 org.springframework.core.io.InputStreamSource接口
- 做爲全部資源的統一抽象,Source 定義了一些通用的方法,由子類 AbstractResource 提供統一的默認實現
- FileSystemResource:對 java.io.File 類型資源的封裝,只要是跟 File 打交道的,基本上與 FileSystemResource 也能夠打交道。支持文件和 URL 的形式,實現 WritableResource 接口,且從 Spring Framework 5.0 開始,FileSystemResource 使用NIO.2 API進行讀/寫交互
- ByteArrayResource:對字節數組提供的數據的封裝。若是經過 InputStream 形式訪問該類型的資源,該實現會根據字節數組的數據構造一個相應的 ByteArrayInputStream。
- UrlResource:對 java.net.URL類型資源的封裝。內部委派 URL 進行具體的資源操做。
- ClassPathResource:class path 類型資源的實現。使用給定的 ClassLoader 或者給定的 Class 來加載資源。
- InputStreamResource:將給定的 InputStream 做爲一種資源的 Resource 的實現類。
統一資源定位:ResourceLoader
org.springframework.core.io.ResourceLoader
爲 Spring 資源加載的統一抽象,具體的資源加載則由相應的實現類來完成
- 因此咱們能夠將 ResourceLoader 稱做爲統一資源定位器
- 該方法的主要實現是在其子類 DefaultResourceLoader 中實現
- ResourceLoader 接口提供兩個方法:
getResource()
、getClassLoader()
- getResource() 方法支持如下模式的資源加載:
- URL位置資源,如」file:C:/test.dat」
- ClassPath位置資源,如」classpath:test.dat」
- 相對路徑資源,如」WEB-INF/test.dat」,此時返回的Resource實例根據實現不一樣而不一樣
DefaultResourceLoader
- DefaultResourceLoader 是 ResourceLoader 的默認實現
- 首先經過 ProtocolResolver 來加載資源,成功返回 Resource,不然調用以下邏輯:
- 若 location 以 / 開頭,則調用
getResourceByPath()
構造 ClassPathContextResource 類型資源並返回
- 若 location 以 classpath: 開頭,則構造 ClassPathResource 類型資源並返回,在構造該資源時,經過
getClassLoader()
獲取當前的 ClassLoader
- 構造 URL ,嘗試經過它進行資源定位,若沒有拋出 MalformedURLException 異常,則判斷是否爲 FileURL , 若是是則構造 FileUrlResource 類型資源,不然構造 UrlResource。若在加載過程當中拋出 MalformedURLException 異常,則委派 getResourceByPath() 實現資源定位加載
- ProtocolResolver ,用戶自定義協議資源解決策略,做爲 DefaultResourceLoader 的 SPI,它容許用戶自定義資源加載協議,而不須要繼承 ResourceLoader 的子類
FileSystemResourceLoader
- FileSystemContextResource 爲 FileSystemResourceLoader 的內部類,它繼承 FileSystemResource
ResourcePatternResolver
- ResourcePatternResolver 是 ResourceLoader 的擴展,它支持根據指定的資源路徑匹配模式每次返回多個 Resource 實例
- ResourcePatternResolver 新增的 classpath*: 前綴外,還支持 Ant 風格的路徑匹配模式(相似於
**/*.xml
)
- PathMatchingResourcePatternResolver 在實例化的時候,能夠指定一個 ResourceLoader,若是不指定的話,它會在內部構造一個 DefaultResourceLoader
- Resource[] getResources(String locationPattern) 方法處理邏輯:
- protected Resource[] findPathMatchingResources(String locationPattern)
-
主要分兩步:spring
-
肯定目錄,獲取該目錄下得全部資源數組
- 在所得到的全部資源中進行迭代匹配獲取咱們想要的資源。
咱們要關注兩個方法,一個是 determineRootDir()
,一個是 doFindPathMatchingFileResources()
框架
determineRootDir()
主要是用於肯定根路徑
下面簡要總結下:spa
- Spring 提供了 Resource 和 ResourceLoader 來統一抽象整個資源及其定位。使得資源與資源的定位有了一個更加清晰的界限,而且提供了合適的 Default 類,使得自定義實現更加方便和清晰
- DefaultResource 爲 Resource 的默認實現,它對 Resource 接口作了一個統一的實現,子類繼承該類後只須要覆蓋相應的方法便可,同時對於自定義的 Resource 咱們也是繼承該類
- DefaultResourceLoader 一樣也是 ResourceLoader 的默認實現,在自定 ResourceLoader 的時候咱們除了能夠繼承該類外還能夠實現 ProtocolResolver 接口來實現自定資源加載協議
- DefaultResourceLoader 每次只能返回單一的資源,因此 Spring 針對這個提供了另一個接口 ResourcePatternResolver ,該接口提供了根據指定的 locationPattern 返回多個資源的策略。其子類 PathMatchingResourcePatternResolver 是一個集大成者的 ResourceLoader ,由於它即實現了 Resource getResource(String location) 也實現了 Resource[] getResources(String locationPattern)