注入Resource
雖然Resource 的子類利用了字符串格式進行了隱藏,但是此時的代碼中,ResourceLoader跟我的開發沒有任何關系,
如果真的開發只關心Resource一個接口就夠了。
為了解決Resource與ResourceLoader的操作的耦合問題,在spring設計的時候考慮到了數據的自動轉型問題。也就是說,利用注入的操作
模式,就可以讓ResourceLoader消失。
范例:編寫一個資源處理類
package com.Resource.util; import org.springframework.core.io.Resource; public class ResourceBean { private Resource resource; public void setResource(Resource resource) { this.resource = resource; } public Resource getResource() { return resource; } }
要想實現數據資源的注入操作,必須編寫applicationContext.xml文件,在這個文件里定義所需要的資源。
范例:在applicationContext.xml文件里面定義資源信息
<bean id="rb" class="com.Resource.util.ResourceBean"> <property name="resource" value="file:D:\\text.xml"></property> </bean>
范例:測試代碼:
package com.Test; import java.util.Scanner; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.Resource.util.ResourceBean; public class TestResource { public static void main(String[] args) throws Exception { ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
//實例化,初始ResourceBean類,並且在applicationContext.xml里面給resource賦值,這個值就指定了Resource的資源路徑 ResourceBean reb=ctx.getBean("rb",ResourceBean.class);
由這個實例對象,獲取它的變量Resource對象,並且通過getInputStream方法,獲取資源,給Scannner Scanner scan=new Scanner(reb.getResource().getInputStream()); scan.useDelimiter("\n"); while(scan.hasNext()) { System.out.println(scan.nextLine()); } } }
運行結果:

范例:獲取一個classPath文件
其他代碼都不用改,只需要改變bean配置就行了。
<bean id="rb" class="com.Resource.util.ResourceBean"> <property name="resource" value="classpath:META-INF/licence.txt"></property> </bean>
利用了配置文件的方式進行處理的時候,用戶關心的只是Resource一個接口的使用,而ResourceLoader接口被spring封裝起來了。
而且最為方便的是,spring允許用戶設置資源數組。
范例:修改程序類
package com.Resource.util; import java.util.List; import org.springframework.core.io.Resource; public class ResourceList { private List<Resource> resource; public void setResource(List<Resource> resource) { this.resource = resource; } public List<Resource> getResource() { return resource; } }
測試代碼:
package com.Test; import java.util.Iterator; import java.util.Scanner; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.Resource; import com.Resource.util.ResourceList; public class TestResourceList { public static void main(String[] args) throws Exception { ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml"); ResourceList reb=ctx.getBean("rblist",ResourceList.class); Iterator<Resource> iter=reb.getResource().iterator(); while(iter.hasNext()) { Scanner scan=new Scanner(iter.next().getInputStream()); scan.useDelimiter("\n"); while(scan.hasNext()) { System.out.println(scan.nextLine()); } System.out.println("**************************"); } } }
利用spring讀取外部文件資源,它的設計比直接使用IO更加容易。
路徑通配符
以上內容有一個問題,就是必須設置完整路徑,但是很多時候不能完整設置路徑。
例如,在不同目錄下都有存在"applicationContext-xxx.xml"命名的結構,要想將其完整的全部讀取進來。那么必須考慮到路徑通配符使用。
在spring中繼續發揚了ANT工具的特征。在這個工具下提供幾種符號:
1):“?”:匹配任意的一位字符。例如:“applicationContext-?.xml”表示可以訪問“applicationContext-1.xml”或"applicationContext-2.xml"。
2):“ * ”:匹配0個或者多個任意字符。
3):“ ** ”:表示匹配任意的目錄,可以是零個,一個或者多個。
但是一旦要進行多個路徑的匹配,那么返回的內容一定是多個,此時就只能利用ResourceLoader的子接口完成讀取。可以使用的
子類:PathMatchingResourcePatternResolver。
范例:讀取資源文件
為了測試,建了兩個目錄:

在spring里面,目錄的訪問不再成為限制。
package com.Resource.Demo; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; public class ClassPathResourceLoader { public static void main(String[] args) throws Exception { ResourcePatternResolver loader=new PathMatchingResourcePatternResolver(); Resource[] resource=loader.getResources("classpath:com/msg/**/applicationContext?.xml"); for(int i=0;i<resource.length;i++) { System.out.println("文件名稱"+resource[i].getFile()+",數據長度:"+resource[i].contentLength()); } } }
1,注意loader對象的類不再是ResourceLoader。
2,注意獲取資源的方法是,getResources,比之前多了一個s。
3,resource對象是一個數組。
3,獲取資源的目錄:getFile,獲取資源名稱,getFilename。
運行結果:
文件名稱D:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\applicationContext2.xml,數據長度:764
文件名稱D:\Myeclipse\document\SpringResource\WebRoot\WEB-INF\classes\com\msg\demo\applicationContext2.xml,數據長度:764
