IOC 之 Spring 統(tǒng)一資源加載策略

2018-10-06

原文推薦 死磕 Spring

統(tǒng)一資源:Resource

org.springframework.core.io.Resource 為 Spring 框架所有資源的抽象和訪問接口,它繼承 org.springframework.core.io.InputStreamSource接口。作為所有資源的統(tǒng)一抽象固耘,Source 定義了一些通用的方法,由子類 AbstractResource 提供統(tǒng)一的默認實現(xiàn)糕韧。

Resource 根據(jù)資源的不同類型提供不同的具體實現(xiàn),如下:
FileSystemResource:對 java.io.File 類型資源的封裝,只要是跟 File 打交道的既绕,基本上與 FileSystemResource 也可以打交道缴挖。支持文件和 URL 的形式袋狞,實現(xiàn) WritableResource 接口,且從 Spring Framework 5.0 開始映屋,F(xiàn)ileSystemResource 使用NIO.2 API進行讀/寫交互

ByteArrayResource:對字節(jié)數(shù)組提供的數(shù)據(jù)的封裝苟鸯。如果通過 InputStream 形式訪問該類型的資源,該實現(xiàn)會根據(jù)字節(jié)數(shù)組的數(shù)據(jù)構造一個相應的 ByteArrayInputStream棚点。

UrlResource:對 java.net.URL類型資源的封裝早处。內(nèi)部委派 URL 進行具體的資源操作。

ClassPathResource:class path 類型資源的實現(xiàn)瘫析。使用給定的 ClassLoader 或者給定的 Class 來加載資源砌梆。

InputStreamResource:將給定的 InputStream 作為一種資源的 Resource 的實現(xiàn)類默责。

AbstractResource 為 Resource 接口的默認實現(xiàn),它實現(xiàn)了 Resource 接口的大部分的公共實現(xiàn)么库,作為 Resource 接口中的重中之重

如果我們想要實現(xiàn)自定義的 Resource傻丝,記住不要實現(xiàn) Resource 接口,而應該繼承 AbstractResource 抽象類诉儒,然后根據(jù)當前的具體資源特性覆蓋相應的方法即可葡缰。

統(tǒng)一資源定位:ResourceLoader

Resource 定義了統(tǒng)一的資源,那資源的加載則由 ResourceLoader 來統(tǒng)一定義忱反。

ResourceLoader 接口提供兩個方法:getResource()泛释、getClassLoader()。
getResource()根據(jù)所提供資源的路徑 location 返回 Resource 實例温算,但是它不確保該 Resource 一定存在怜校,需要調用 Resource.exist()方法判斷。該方法支持以下模式的資源加載:
URL位置資源注竿,如”file:C:/test.dat”
ClassPath位置資源茄茁,如”classpath:test.dat”
相對路徑資源,如”WEB-INF/test.dat”巩割,此時返回的Resource實例根據(jù)實現(xiàn)不同而不同
該方法的主要實現(xiàn)是在其子類 DefaultResourceLoader中實現(xiàn)裙顽,具體過程我們在分析DefaultResourceLoader時做詳細說明。
getClassLoader()返回 ClassLoader 實例宣谈,對于想要獲取 ResourceLoader 使用的 ClassLoader 用戶來說愈犹,可以直接調用該方法來獲取,
在分析 Resource 時闻丑,提到了一個類 ClassPathResource 漩怎,這個類是可以根據(jù)指定的 ClassLoader 來加載資源的。

....

總結:

Spring 提供了 Resource 和 ResourceLoader 來統(tǒng)一抽象整個資源及其定位嗦嗡。使得資源與資源的定位有了一個更加清晰的界限勋锤,并且提供了合適的 Default 類,使得自定義實現(xiàn)更加方便和清晰侥祭。
DefaultResource 為 Resource 的默認實現(xiàn)叁执,它對 Resource 接口做了一個統(tǒng)一的實現(xiàn),子類繼承該類后只需要覆蓋相應的方法即可卑硫,同時對于自定義的 Resource 我們也是繼承該類。
DefaultResourceLoader 同樣也是 ResourceLoader 的默認實現(xiàn)蚕断,在自定 ResourceLoader 的時候我們除了可以繼承該類外還可以實現(xiàn) ProtocolResolver 接口來實現(xiàn)自定資源加載協(xié)議欢伏。
DefaultResourceLoader 每次只能返回單一的資源,所以 Spring 針對這個提供了另外一個接口 ResourcePatternResolver 亿乳,該接口提供了根據(jù)指定的 locationPattern 返回多個資源的策略硝拧。其子類 PathMatchingResourcePatternResolver 是一個集大成者的 ResourceLoader 径筏,因為它即實現(xiàn)了 Resource getResource(String location) 也實現(xiàn)了 Resource[] getResources(String locationPattern)。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末障陶,一起剝皮案震驚了整個濱河市滋恬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抱究,老刑警劉巖恢氯,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鼓寺,居然都是意外死亡勋拟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門妈候,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敢靡,“玉大人,你說我怎么就攤上這事苦银⌒ル剩” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵幔虏,是天一觀的道長纺念。 經(jīng)常有香客問我,道長所计,這世上最難降的妖魔是什么柠辞? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮主胧,結果婚禮上叭首,老公的妹妹穿的比我還像新娘。我一直安慰自己踪栋,他們只是感情好焙格,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夷都,像睡著了一般眷唉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上囤官,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天冬阳,我揣著相機與錄音,去河邊找鬼党饮。 笑死肝陪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的刑顺。 我是一名探鬼主播氯窍,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼饲常,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狼讨?” 一聲冷哼從身側響起贝淤,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎政供,沒想到半個月后播聪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鲫骗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年犬耻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片执泰。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡枕磁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出术吝,到底是詐尸還是另有隱情计济,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布排苍,位于F島的核電站沦寂,受9級特大地震影響,放射性物質發(fā)生泄漏淘衙。R本人自食惡果不足惜传藏,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彤守。 院中可真熱鬧毯侦,春花似錦、人聲如沸具垫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筝蚕。三九已至卦碾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起宽,已是汗流浹背洲胖。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坯沪,地道東北人绿映。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像屏箍,于是被迫代替她去往敵國和親绘梦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理赴魁,服務發(fā)現(xiàn)卸奉,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 本文是我自己在秋招復習時的讀書筆記颖御,整理的知識點榄棵,也是為了防止忘記,尊重勞動成果潘拱,轉載注明出處哦疹鳄!如果你也喜歡,那...
    波波波先森閱讀 12,284評論 6 86
  • 作為Spring提供的較之BeanFactory更為先進的IoC容器實現(xiàn)芦岂,ApplicationContext除了...
    好好學習Sun閱讀 791評論 0 2
  • 模塊化解決的問題 全局變量的災難. 函數(shù)命名沖突 依賴關系不好管理 模塊化發(fā)展過程中的 7 種方式 一個文件瘪弓、一個...
    Mr無愧于心閱讀 1,778評論 1 4
  • 昨天上午和一大學室友一起去了廣濟寺,然后中午吃飯聊天禽最,談到了大學時候的每一個宿舍腺怯,也談到了我們到了攢錢的年齡。她...
    槿瓊閱讀 146評論 0 0