Java的各種URL前綴的標准類和標准處理程序不足以完全訪問低級資源。例如,沒有URL
可用於訪問需要從類路徑或相對於a獲取的資源的標准化實現 ServletContext
。雖然可以為專用URL
前綴注冊新的處理程序(類似於現有的前綴處理程序http:
),但這通常非常復雜,並且URL
接口仍然缺少一些理想的功能,例如檢查資源是否存在的方法指着。
Resource接口
Spring的Resource接口是一個更強大的接口,用於抽象對低級資源的訪問。以下清單顯示了Resource接口定義:
1 public interface Resource extends InputStreamSource { 2 3 boolean exists(); 4 5 boolean isOpen(); 6 7 URL getURL() throws IOException; 8 9 File getFile() throws IOException; 10 11 Resource createRelative(String relativePath) throws IOException; 12 13 String getFilename(); 14 15 String getDescription(); 16 17 }
如Resource界面定義所示,它擴展了InputStreamSource 界面。以下清單顯示了InputStreamSource 界面的定義:
1 public interface InputStreamSource { 2 3 InputStream getInputStream() throws IOException; 4 5 }
Resource界面中一些最重要的方法是:
getInputStream():找到並打開資源,返回InputStream從資源中讀取的內容。預計每次調用都會返回一個新的 InputStream。呼叫者有責任關閉流。
exists():返回boolean指示此資源是否實際以物理形式存在的指示。
isOpen():返回一個boolean指示此資源是否表示具有打開流的句柄的指示符。如果true,InputStream不能多次讀取,必須只讀一次然后關閉以避免資源泄漏。false所有常規資源實現的返回值,但InputStreamResource。
getDescription():返回此資源的描述,用於處理資源時的錯誤輸出。這通常是完全限定的文件名或資源的實際URL。
其他方法允許您獲取表示資源的實際URL或File對象(如果底層實現兼容並支持該功能)。
Resource實現
Spring包括以下Resource實現:
- UrlResource:
UrlResource
包裝ajava.net.URL
並可用於訪問通常可通過URL訪問的任何對象,例如文件,HTTP目標,FTP目標等。 - ClassPathResource:此類表示應從類路徑獲取的資源。它使用線程上下文類加載器,給定的類加載器或給定的類來加載資源。
- FileSystemResource:這是一個
Resource
實現java.io.File
和java.nio.file.Path
處理。它支持分辨率作為File
和URL
。 - ServletContextResource:這是一個資源
Resource
實現,用於ServletContext
解釋相關Web應用程序根目錄中的相對路徑。 - InputStreamResource:
InputStreamResource
是Resource
給定的實現InputStream
。只有在沒有Resource
適用的具體實施時才應使用它。 - ByteArrayResource:這是
Resource
給定字節數組的實現。它ByteArrayInputStream
為給定的字節數組創建一個 。
ResourceLoader
該ResourceLoader接口旨在由可以返回(即加載)Resource實例的對象實現。以下清單顯示了ResourceLoader 接口定義:
1 public interface ResourceLoader { 2 3 Resource getResource(String location); 4 5 }
調用getResource()特定的應用程序上下文,並且指定的位置路徑沒有特定的前綴時,您將返回一個Resource適合該特定應用程序上下文的類型。例如,假設針對ClassPathXmlApplicationContext實例執行了以下代碼片段:
1 Resource template = ctx.getResource("some/resource/path/myTemplate.txt");
前綴 | 示例 | 說明 |
---|---|---|
classpath: |
|
從類路徑加載 |
file: |
|
|
http: |
|
加載為 |
(none) |
|
取決於潛在的 |
應用程序上下文構造函數值中的資源路徑可以是簡單路徑,每個路徑都與目標進行一對一映射Resource
,或者可以包含特殊的“classpath *:”前綴或內部Ant-樣式正則表達式(使用Spring的PathMatcher
實用程序匹配)。后者都是有效的通配符。
“classpath *:” 此特殊前綴指定必須獲取與給定名稱匹配的所有類路徑資源,然后合並以形成最終的應用程序上下文定義。
Ant風格的資源地址,支持3種匹配符;
- ?:匹配文件名中的一個字符;
- * :匹配文件名中的任意個字符
- **:匹配多層路徑
下面是幾個示例:
classpath:com/ssh/t?st.xml:匹配com/ssh路徑下的com/ssh/test.xml、com/ssh/tast.xml等
file:D:/conf/*Config.xml:匹配文件系統D:/conf路徑下的所有文件以Config.xml為后綴的文件,比如匹配HibernateConf.xml,SpringConf.xml等;
classpath:com/**/test/xml:匹配com類路徑下(當前目錄及其子孫目錄)的test.xml文件,比如匹配:com/a/test.xml、com/a/b/c/d/test.xml等