javascript
Spring--Resource
在日常程序開發中,處理外部資源是很繁瑣的事情,我們可能需要處理URL資源、File資源資源、ClassPath相關資源、服務器相關資源(JBoss AS 5.x上的VFS資源)等等很多資源。因此處理這些資源需要使用不同的接口,這就增加了我們系統的復雜性;而且處理這些資源步驟都是類似的(打開資源、讀取資源、關閉資源),因此如果能抽象出一個統一的接口來對這些底層資源進行統一訪問,是不是很方便,而且使我們系統更加簡潔,都是對不同的底層資源使用同一個接口進行訪問。
Spring 提供一個Resource接口來統一這些底層資源一致的訪問,而且提供了一些便利的接口,從而能提供我們的生產力。
?
類繼承圖
類定義
InputStreamSource
public interface InputStreamSource {InputStream getInputStream() throws IOException; }getInputStream:定位并打開資源,返回資源對應的輸入流。每次調用都會返回新的輸入流,調用者在使用完畢后必須關閉該資源。?
Resource
public interface Resource extends InputStreamSource {boolean exists();boolean isReadable();boolean isOpen();URL getURL() throws IOException;URI getURI() throws IOException;File getFile() throws IOException;long contentLength() throws IOException;long lastModified() throws IOException;Resource createRelative(String relativePath) throws IOException;String getFilename();String getDescription(); }UrlResource
代表URL資源,用于簡化URL資源訪問,是對java.net.URL的包裝。在java中,將不同來源的資源抽象成URL,通過注冊不同的handler來處理不同來源的資源的讀取邏輯。一般不同類型使用不同的前綴。
isOpen永遠返回false,表示可多次讀取資源。
UrlResource應該提供標準的協議前綴,一般支持如下資源訪問:
- http:通過標準的http協議訪問web資源,如new UrlResource(“http://地址”);
- ftp:通過ftp協議訪問資源,如new UrlResource(“ftp://地址”);
- file:通過file協議訪問本地文件系統資源,如new UrlResource(“file:d:/test.txt”)
但是UrlResource無法解決相對classpath路徑或servletContext的處理方法,因此需要其他的Resource實現類。
ClassPathResource
代表classpath路徑的資源,將使用ClassLoader進行加載資源。主要優勢是方便訪問類加載路徑下的資源,尤其是Web應用,因為它可以自動搜索位于WEB-INF/classes下的資源文件
classpath資源存在于類路徑中的文件系統中或jar包里,且isOpen永遠返回false,表示可多次讀取資源。
ClassPathResource加載資源替代了Class類和ClassLoader類的getResource(String name)和getResourceAsStream(String name)兩個加載類路徑資源方法,提供一致的訪問方式。
ClassPathResource提供了三個構造器:
- public ClassPathResource(String path):使用默認的ClassLoader加載“path”類路徑資源;
- public ClassPathResource(String path, ClassLoader classLoader):使用指定的ClassLoader加載“path”類路徑資源;
- public ClassPathResource(String path, Class<?> clazz):使用指定的類加載“path”類路徑資源,將加載相對于當前類的路徑的資源;
當Spring獲取資源時,路徑字符串前綴是"classpath:",則系統將會自動創建ClassPathResource對象
FileSystemResource
代表java.io.File資源,對于getInputStream操作將返回底層文件的字節流,isOpen將永遠返回false,從而表示可多次讀取底層文件的字節流。
public static void Test_FileSystemResource() {File file = new File("d:/test.txt");Resource resource = new FileSystemResource(file);if (resource.exists()) {dumpStream(resource);}Assert.isTrue(!resource.isOpen()); }當Spring獲取資源時,路徑字符串前綴是"file:",則系統將會自動創建FileSystemResource對象
ServletContextResource
訪問Web Context下相對路徑下的資源,入參的資源位置是相對于Web應用根路徑的位置(工程文件夾下,WEB-INF所在的那級文件夾)。用于簡化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。
使用ServletContextResource無需關心資源是否被解壓縮出來,或者直接存放在JAR文件中,都可以通過Servlet容器訪問。
入參需要ServletContext和字符串類型
public class ResourceTest {ServletContextResource resource = new ServletContextResource(servletContext,"spring.xml");}InputStreamResource
代表java.io.InputStream字節流,對于getInputStream操作將直接返回該字節流,因此只能讀取一次該字節流,即isOpen永遠返回true(其他Resource大都為false可以多次讀取)
只有當沒有合適的Resource實現時,才考慮使用InputStreamResource。一般考慮使用ByteArrayResource
ByteArrayResource
可多次讀取數組資源,即isOpen()永遠返回false?
ByteArrayResource因為入參可以是byte[]類型,所以用途比較廣泛,可以把從網絡或者本地資源都轉換為byte[]類型,然后用ByteArrayResource轉化為資源。
?
總結
以上是生活随笔為你收集整理的Spring--Resource的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring--@within和@tar
- 下一篇: Spring Cloud依赖