javascript
Spring--Resource
在日常程序開(kāi)發(fā)中,處理外部資源是很繁瑣的事情,我們可能需要處理URL資源、File資源資源、ClassPath相關(guān)資源、服務(wù)器相關(guān)資源(JBoss AS 5.x上的VFS資源)等等很多資源。因此處理這些資源需要使用不同的接口,這就增加了我們系統(tǒng)的復(fù)雜性;而且處理這些資源步驟都是類(lèi)似的(打開(kāi)資源、讀取資源、關(guān)閉資源),因此如果能抽象出一個(gè)統(tǒng)一的接口來(lái)對(duì)這些底層資源進(jìn)行統(tǒng)一訪(fǎng)問(wèn),是不是很方便,而且使我們系統(tǒng)更加簡(jiǎn)潔,都是對(duì)不同的底層資源使用同一個(gè)接口進(jìn)行訪(fǎng)問(wèn)。
Spring 提供一個(gè)Resource接口來(lái)統(tǒng)一這些底層資源一致的訪(fǎng)問(wèn),而且提供了一些便利的接口,從而能提供我們的生產(chǎn)力。
?
類(lèi)繼承圖
類(lèi)定義
InputStreamSource
public interface InputStreamSource {InputStream getInputStream() throws IOException; }getInputStream:定位并打開(kāi)資源,返回資源對(duì)應(yīng)的輸入流。每次調(diào)用都會(huì)返回新的輸入流,調(diào)用者在使用完畢后必須關(guān)閉該資源。?
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資源,用于簡(jiǎn)化URL資源訪(fǎng)問(wèn),是對(duì)java.net.URL的包裝。在java中,將不同來(lái)源的資源抽象成URL,通過(guò)注冊(cè)不同的handler來(lái)處理不同來(lái)源的資源的讀取邏輯。一般不同類(lèi)型使用不同的前綴。
isOpen永遠(yuǎn)返回false,表示可多次讀取資源。
UrlResource應(yīng)該提供標(biāo)準(zhǔn)的協(xié)議前綴,一般支持如下資源訪(fǎng)問(wèn):
- http:通過(guò)標(biāo)準(zhǔn)的http協(xié)議訪(fǎng)問(wèn)web資源,如new UrlResource(“http://地址”);
- ftp:通過(guò)ftp協(xié)議訪(fǎng)問(wèn)資源,如new UrlResource(“ftp://地址”);
- file:通過(guò)file協(xié)議訪(fǎng)問(wèn)本地文件系統(tǒng)資源,如new UrlResource(“file:d:/test.txt”)
但是UrlResource無(wú)法解決相對(duì)classpath路徑或servletContext的處理方法,因此需要其他的Resource實(shí)現(xiàn)類(lèi)。
ClassPathResource
代表classpath路徑的資源,將使用ClassLoader進(jìn)行加載資源。主要優(yōu)勢(shì)是方便訪(fǎng)問(wèn)類(lèi)加載路徑下的資源,尤其是Web應(yīng)用,因?yàn)樗梢宰詣?dòng)搜索位于WEB-INF/classes下的資源文件
classpath資源存在于類(lèi)路徑中的文件系統(tǒng)中或jar包里,且isOpen永遠(yuǎn)返回false,表示可多次讀取資源。
ClassPathResource加載資源替代了Class類(lèi)和ClassLoader類(lèi)的getResource(String name)和getResourceAsStream(String name)兩個(gè)加載類(lèi)路徑資源方法,提供一致的訪(fǎng)問(wèn)方式。
ClassPathResource提供了三個(gè)構(gòu)造器:
- public ClassPathResource(String path):使用默認(rèn)的ClassLoader加載“path”類(lèi)路徑資源;
- public ClassPathResource(String path, ClassLoader classLoader):使用指定的ClassLoader加載“path”類(lèi)路徑資源;
- public ClassPathResource(String path, Class<?> clazz):使用指定的類(lèi)加載“path”類(lèi)路徑資源,將加載相對(duì)于當(dāng)前類(lèi)的路徑的資源;
當(dāng)Spring獲取資源時(shí),路徑字符串前綴是"classpath:",則系統(tǒng)將會(huì)自動(dòng)創(chuàng)建ClassPathResource對(duì)象
FileSystemResource
代表java.io.File資源,對(duì)于getInputStream操作將返回底層文件的字節(jié)流,isOpen將永遠(yuǎn)返回false,從而表示可多次讀取底層文件的字節(jié)流。
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()); }當(dāng)Spring獲取資源時(shí),路徑字符串前綴是"file:",則系統(tǒng)將會(huì)自動(dòng)創(chuàng)建FileSystemResource對(duì)象
ServletContextResource
訪(fǎng)問(wèn)Web Context下相對(duì)路徑下的資源,入?yún)⒌馁Y源位置是相對(duì)于Web應(yīng)用根路徑的位置(工程文件夾下,WEB-INF所在的那級(jí)文件夾)。用于簡(jiǎn)化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作。
使用ServletContextResource無(wú)需關(guān)心資源是否被解壓縮出來(lái),或者直接存放在JAR文件中,都可以通過(guò)Servlet容器訪(fǎng)問(wèn)。
入?yún)⑿枰猄ervletContext和字符串類(lèi)型
public class ResourceTest {ServletContextResource resource = new ServletContextResource(servletContext,"spring.xml");}InputStreamResource
代表java.io.InputStream字節(jié)流,對(duì)于getInputStream操作將直接返回該字節(jié)流,因此只能讀取一次該字節(jié)流,即isOpen永遠(yuǎn)返回true(其他Resource大都為false可以多次讀取)
只有當(dāng)沒(méi)有合適的Resource實(shí)現(xiàn)時(shí),才考慮使用InputStreamResource。一般考慮使用ByteArrayResource
ByteArrayResource
可多次讀取數(shù)組資源,即isOpen()永遠(yuǎn)返回false?
ByteArrayResource因?yàn)槿雲(yún)⒖梢允莃yte[]類(lèi)型,所以用途比較廣泛,可以把從網(wǎng)絡(luò)或者本地資源都轉(zhuǎn)換為byte[]類(lèi)型,然后用ByteArrayResource轉(zhuǎn)化為資源。
?
總結(jié)
以上是生活随笔為你收集整理的Spring--Resource的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring--@within和@tar
- 下一篇: Tomcat总体架构