【sping揭秘】6、IOC容器之统一资源加载策略
Spring中的resource
?
我們先看看類之間的關(guān)系
?
注意我們的application是間接繼承了resourceloader的,也就是說我們的application其實就是一個resourceloader
?
?
?
我們再看看這個類的繼承,發(fā)現(xiàn)了,classpathxml這個對象實際上也是從最開始的resourceloader來的
?
那么我們加載application資源的時候,可以有2種方式:
?
?
ResourceLoader resourceLoader = new ClassPathXmlApplicationContext("classpath:applicationContext-bean.xml");//第二種方式 ResourceLoader resourceLoader2 = new FileSystemXmlApplicationContext("classpath:applicationContext-bean.xml");
?
?
都是可以的哈,都是可以的!!!
?
那這個resourceloader有什么用???
?
關(guān)鍵就是那個getResource(String)方法,獲取資源
?
自然而然,我們會想,這個能獲取什么資源,怎么去獲取資源,嗯。。。
具體怎么獲取我們繼續(xù)看書。。。
?
在搞清除怎么獲取資源之前,我們想一下如何去獲取這個resourceloader,如果我們每次獲取都要用new ClassPathXmlApplicationContext或者new FileSystemXmlApplicationContext
?
獲取這個對象的方法spring也有提供,我們只要實現(xiàn)ResourceLoaderAware或者ApplicationContextAware就可以實現(xiàn)了(因為applicationContext也是resourceloader的一種,參考上面的UML圖
)
?
?
Public class FooBar implements ResourceLoaderAware {//資源加載器private ResourceLoader resourceLoader;public void foo(String location) {//這里有沒有很熟悉 // ResourceDemo.class.getResource(location).getClass()System.out.println(this.getResourceLoader().getResource(location).getClass());}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {//這里進行resourceloader的注入this.resourceLoader = resourceLoader;}public ResourceLoader getResourceLoader() {return resourceLoader;}}Public class FooBar2 implements ApplicationContextAware {//資源加載器private ResourceLoader resourceLoader;public void foo(String location) {//這里有沒有很熟悉 // ResourceDemo.class.getResource(location).getClass()System.out.println(this.getResourceLoader().getResource(location).getClass());}public ResourceLoader getResourceLoader() {return resourceLoader;}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// TODO Auto-generated method stub//這里進行resourceloader的注入this.resourceLoader = applicationContext;}}
?
然后我們需要在對應(yīng)的配置文件中配置好這個bean,那spring就會自動為這個bean注入resource了
?
?
<bean id="fooBar" class="cn.cutter.start.resourceloader.FooBar" /><bean id="fooBar2" class="cn.cutter.start.resourceloader.FooBar2" />
好吧,看到這里是不是有點暈了,到底resourceloader和resource是什么玩意???
?
我們先放下書,冷靜一下,想一下這到底是個啥玩意,有啥作用???
?
前面resourceloader我們看到了可以用來加載資源,可以加載spring配置文件,那么resource呢?
?
我們的resource是可以通過resourceloader中的get方法獲取,那么不同的resourceloader是不是會獲取到不同的resource呢?
我們先從默認(rèn)的defaultresourceloader方法看起
?
?
?
?
這個類也很光棍,既然要返回那么就直接返回resource算了,反正也是接口實現(xiàn)的
?
那么我們可以看看可以返回那些resource,是不是不同的策略可以返回不同的resource
?
?ClassPathResource可用來獲取類路徑下的資源文件。假設(shè)我們有一個資源文件test.txt在類路徑下,我們就可以通過給定對應(yīng)資源文件在類路徑下的路徑path來獲取它,new ClassPathResource(“test.txt”)。
?FileSystemResource可用來獲取文件系統(tǒng)里面的資源。我們可以通過對應(yīng)資源文件的文件路徑來構(gòu)建一個FileSystemResource。FileSystemResource還可以往對應(yīng)的資源文件里面寫內(nèi)容,當(dāng)然前提是當(dāng)前資源文件是可寫的,這可以通過其isWritable()方法來判斷。FileSystemResource對外開放了對應(yīng)資源文件的輸出流,可以通過getOutputStream()方法獲取到。
?UrlResource可用來代表URL對應(yīng)的資源,它對URL做了一個簡單的封裝。通過給定一個URL地址,我們就能構(gòu)建一個UrlResource。
ByteArrayResource是針對于字節(jié)數(shù)組封裝的資源,它的構(gòu)建需要一個字節(jié)數(shù)組。
ServletContextResource是針對于ServletContext封裝的資源,用于訪問ServletContext環(huán)境下的資源。ServletContextResource持有一個ServletContext的引用,其底層是通過ServletContext的getResource()方法和getResourceAsStream()方法來獲取資源的。
InputStreamResource是針對于輸入流封裝的資源,它的構(gòu)建需要一個輸入流。
?
可以看得出來,這類resource可以看成相應(yīng)的資源,借助java的io流,我們可以獲取對應(yīng)的資源的輸入流,那么通過io流就就可以獲取到對應(yīng)的資源,不論是類,文件,還是字節(jié)流,都可以看成不同的資源
?
?
那么這些跟spring有什么關(guān)系呢???
我們實體操作一個
?
package cn.cutter.start.resourceloader;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;import org.springframework.core.io.Resource;/*** 用來測試spring的統(tǒng)一資源加載策略* @author xiaof**/ public class ResourceDemo {private Resource resource;public void printContent() {if (resource != null && resource.exists()) {if (resource.isReadable()) {InputStream is;try {is = resource.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String line;while ((line = br.readLine()) != null) {System.out.println(line);}if (is != null) {is.close();}if (br != null) {br.close();}} catch (IOException e) {e.printStackTrace();}}}}public void setResource(Resource resource) {this.resource = resource;}}
Spring配置文件:
?
?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"><context:component-scan base-package="cn.cutter" /><bean id="ttmRateService" class="cn.cutter.simplefx.service.impl.MockTTMRateServiceImpl"></bean><bean id="fooBar" class="cn.cutter.start.resourceloader.FooBar" /><bean id="fooBar2" class="cn.cutter.start.resourceloader.FooBar2" /><bean id="resourceDemo" class="cn.cutter.start.resourceloader.ResourceDemo"><property name="resource"><value>classpath:applicationContext-bean.xml</value></property></bean></beans>
測試案例:
?
@Testpublic void testPrintContext() {ApplicationContext ctx = before();ResourceDemo resourceDemo = (ResourceDemo) ctx.getBean("resourceDemo");resourceDemo.printContent();}
結(jié)果展示:
?
?
?
?
我們看得到,這個資源其實就是輸出這個文件流內(nèi)容。
?
轉(zhuǎn)載于:https://www.cnblogs.com/cutter-point/p/8626713.html
總結(jié)
以上是生活随笔為你收集整理的【sping揭秘】6、IOC容器之统一资源加载策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这部电影被禁了吗?
- 下一篇: 一部东欧冷兵器时代电影,男主有一把战斧,