日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【sping揭秘】6、IOC容器之统一资源加载策略

發布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【sping揭秘】6、IOC容器之统一资源加载策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring中的resource

?

我們先看看類之間的關系

?

注意我們的application是間接繼承了resourceloader的,也就是說我們的application其實就是一個resourceloader

?

?

?

我們再看看這個類的繼承,發現了,classpathxml這個對象實際上也是從最開始的resourceloader來的

?

那么我們加載application資源的時候,可以有2種方式:

?

?

ResourceLoader resourceLoader = new ClassPathXmlApplicationContext("classpath:applicationContext-bean.xml");//第二種方式
ResourceLoader resourceLoader2 = new FileSystemXmlApplicationContext("classpath:applicationContext-bean.xml");

?

?

都是可以的哈,都是可以的!!!

?

那這個resourceloader有什么用???

?

關鍵就是那個getResource(String)方法,獲取資源

?

自然而然,我們會想,這個能獲取什么資源,怎么去獲取資源,嗯。。。

具體怎么獲取我們繼續看書。。。

?

在搞清除怎么獲取資源之前,我們想一下如何去獲取這個resourceloader,如果我們每次獲取都要用new ClassPathXmlApplicationContext或者new FileSystemXmlApplicationContext

?

獲取這個對象的方法spring也有提供,我們只要實現ResourceLoaderAware或者ApplicationContextAware就可以實現了(因為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;}}

?

然后我們需要在對應的配置文件中配置好這個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呢?

我們先從默認的defaultresourceloader方法看起

?

?

?

?

這個類也很光棍,既然要返回那么就直接返回resource算了,反正也是接口實現的

?

那么我們可以看看可以返回那些resource,是不是不同的策略可以返回不同的resource

?

?ClassPathResource可用來獲取類路徑下的資源文件。假設我們有一個資源文件test.txt在類路徑下,我們就可以通過給定對應資源文件在類路徑下的路徑path來獲取它,new ClassPathResource(“test.txt”)。

?FileSystemResource可用來獲取文件系統里面的資源。我們可以通過對應資源文件的文件路徑來構建一個FileSystemResource。FileSystemResource還可以往對應的資源文件里面寫內容,當然前提是當前資源文件是可寫的,這可以通過其isWritable()方法來判斷。FileSystemResource對外開放了對應資源文件的輸出流,可以通過getOutputStream()方法獲取到。

?UrlResource可用來代表URL對應的資源,它對URL做了一個簡單的封裝。通過給定一個URL地址,我們就能構建一個UrlResource。

ByteArrayResource是針對于字節數組封裝的資源,它的構建需要一個字節數組。

ServletContextResource是針對于ServletContext封裝的資源,用于訪問ServletContext環境下的資源。ServletContextResource持有一個ServletContext的引用,其底層是通過ServletContext的getResource()方法和getResourceAsStream()方法來獲取資源的。

InputStreamResource是針對于輸入流封裝的資源,它的構建需要一個輸入流。

?

可以看得出來,這類resource可以看成相應的資源,借助java的io流,我們可以獲取對應的資源的輸入流,那么通過io流就就可以獲取到對應的資源,不論是類,文件,還是字節流,都可以看成不同的資源

?

?

那么這些跟spring有什么關系呢???

我們實體操作一個

?

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的統一資源加載策略* @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();}

結果展示:

?

?

?

?

我們看得到,這個資源其實就是輸出這個文件流內容。

?

轉載于:https://www.cnblogs.com/cutter-point/p/8626713.html

總結

以上是生活随笔為你收集整理的【sping揭秘】6、IOC容器之统一资源加载策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。