Resource接口,及资源
Resource介紹
編碼的時候,除了代碼本身,我們還需要對外部的資源進行處理。例如:URL資源、URI資源、File資源、ClassPath相關資源、服務器相關資源(VFS等)等等。
而這些資源的處理是類似而繁瑣的,如:打開資源、讀取資源、關閉資源。
所以Spring提供了一個專門的接口Resource 用于統一這些底層資源的訪問。
?
就是說,Spring的Resource接口代表底層外部資源,提供了對底層外部資源的一致性訪問接口。
源碼如下:
public interface InputStreamSource {InputStream getInputStream() throws IOException; } 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(); }Resource接口提供了足夠的抽象,足夠滿足我們日常使用。而且提供了很多內置Resource實現:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等。
ByteArrayResource代表byte[]數組資源,對于 getInputStream() 操作將返回一個ByteArrayInputStream。ByteArrayResource可多次讀取數組資源,即 isOpen() 永遠返回false。InputStreamResource代表java.io.InputStream字節流,對于getInputStream() 操作將直接返回該字節流,因此只能讀取一次該字節流,即 isOpen() 永遠返回true。FileSystemResource代表java.io.File資源,對于 getInputStream() 操作將返回底層文件的字節流,isOpen() 將永遠返回false,從而表示可多次讀取底層文件的字節流。 ClassPathResource代表classpath路徑的資源,將使用ClassLoader進行加載資源。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”類路徑資源;-- 比如當前類路徑是“cn.javass.spring.chapter4.ResourceTest”,而需要加載的資源路徑是“cn/javass/spring/chapter4/test1.properties”,則將加載的資源在“cn/javass/spring/chapter4/test1.properties”;public ClassPathResource(String path, Class<?> clazz):使用指定的類加載“path”類路徑資源,將加載相對于當前類的路徑的資源;-- 比如當前類路徑是“cn.javass.spring.chapter4.ResourceTest”,而需要加載的資源路徑是“cn/javass/spring/chapter4/test1.properties”,則將加載的資源在“cn/javass/spring/chapter4/cn/javass/spring/chapter4/test1.properties”;-- 而如果需要 加載的資源路徑為“test1.properties”,將加載的資源為“cn/javass/spring/chapter4/test1.properties”。
-- 需要注意一定:資源查找順序是先查找當前類路徑的資源,再去查找jar包,而且,只要找到就會返回。
-- 如果是在jar包中的資源,需要使用getURL(),而不是getFile(),因為資源不是存在于File系統,而是存在于jar包中!!! UrlResource代表URL資源,用于簡化URL資源訪問。“isOpen”永遠返回false,表示可多次讀取資源。UrlResource一般支持如下資源訪問:http:通過標準的http協議訪問web資源,如new UrlResource(“http://地址”);ftp:通過ftp協議訪問資源,如new UrlResource(“ftp://地址”);file:通過file協議訪問本地文件系統資源,如new UrlResource(“file:d:/test.txt”); ServletContextResource代表web應用資源,用于簡化servlet容器的ServletContext接口的getResource操作和getResourceAsStream操作; VfsResource代表Jboss 虛擬文件系統資源。
?
?
Resource訪問
ResourceLoader接口用于返回Resource對象;其實現可以看作是一個生產Resource的工廠類。
public interface ResourceLoader {Resource getResource(String location);ClassLoader getClassLoader(); }getResource接口用于根據提供的location參數返回相應的Resource對象;而getClassLoader則返回加載這些Resource的ClassLoader。
?
Spring提供了一個適用于所有環境的DefaultResourceLoader實現,可以返回ClassPathResource、UrlResource;
還提供一個用于web環境的ServletContextResourceLoader,它繼承了DefaultResourceLoader的所有功能,又額外提供了獲取ServletContextResource的支持。
?
ResourceLoader在進行加載資源時需要使用前綴來指定需要加載:“classpath:path”表示返回ClasspathResource,“http://path”和“file:path”表示返回UrlResource資源;如果不加前綴則需要根據當前上下文來決定;另外,DefaultResourceLoader默認實現可以加載classpath資源。
?
目前所有的ApplicationContext都實現了ResourceLoader,因此可以使用其來加載資源。
ClassPathXmlApplicationContext:不指定前綴將返回默認的ClassPathResource資源,否則將根據前綴來加載資源; FileSystemXmlApplicationContext:不指定前綴將返回FileSystemResource,否則將根據前綴來加載資源; WebApplicationContext:不指定前綴將返回ServletContextResource,否則將根據前綴來加載資源; 其他:不指定前綴根據當前上下文返回Resource實現,否則將根據前綴來加載資源。?
ResourceLoader
ResourceLoaderAware是一個標記接口,用于通過ApplicationContext注入ResourceLoader。
?
注入Resource
通過注入來獲取ResourceLoader,再來訪問資源,很麻煩!!!
Spring提供了ResourceEditor(這是一個PropertyEditor),用于在注入的字符串和Resource之間進行轉換。
因此可以使用注入方式注入Resource。
package cn.javass.spring.chapter4.bean; import org.springframework.core.io.Resource; public class ResourceBean3 {private Resource resource;public Resource getResource() {return resource;}public void setResource(Resource resource) {this.resource = resource;} } <bean id="resourceBean1" class="cn.javass.spring.chapter4.bean.ResourceBean3"><property name="resource" value="cn/javass/spring/chapter4/test1.properties"/> </bean> <bean id="resourceBean2" class="cn.javass.spring.chapter4.bean.ResourceBean3"><property name="resource" value="classpath:cn/javass/spring/chapter4/test1.properties"/> </bean>注意此處“resourceBean1”注入的路徑沒有前綴表示根據使用的ApplicationContext實現進行選擇Resource實現。
?
?Resource通配符路徑
Spring提供了一種更強大的Ant模式通配符匹配,能匹配一批資源。
Ant路徑通配符支持“?”、“*”、“**”,注意通配符匹配不包括目錄分隔符“/”:“?”:匹配一個字符,如“config?.xml”將匹配“config1.xml”;“*”:匹配零個或多個字符串,如“cn/*/config.xml”將匹配“cn/javass/config.xml”,但不匹配匹配“cn/config.xml”;而“cn/config-*.xml”將匹配“cn/config-dao.xml”;“**”:匹配路徑中的零個或多個目錄,如“cn/**/config.xml”將匹配“cn /config.xml”,也匹配“cn/javass/spring/config.xml”;而“cn/javass/config-**.xml”將匹配“cn/javass/config-dao.xml”,即把“**”當做兩個“*”處理。?
?
?
小結:
① Spring通過Resource接口統一訪問外部資源,并提供了一堆實現類,可以分別訪問File、classpath、URL、URI等等資源。
② Spring通過ResourceLoader接口獲取Resource。
③ ApplicationContext都實現了ResourceLoader接口,所以可以直接加載資源!
④ 實現ResourceLoaderAware接口,可以注入ResourceLoader。
⑤ 注入Resource。
⑥ Resource通配符路徑。
?
?
?
聲明:源自張開濤的Spring教程,稍作加工。
?
轉載于:https://www.cnblogs.com/larryzeal/p/5523578.html
總結
以上是生活随笔為你收集整理的Resource接口,及资源的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 黑椒口蘑牛肉粒?
 - 下一篇: Android——数据存储(课堂代码整理