spring-boot: 相對路徑:classpath: Resource 接口: 訪問資源

https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/resources.html

  1. java.net.URL

  2. classpath:類路徑:
    就是應用的源碼路徑:tomcat/webapps/應用/源碼文件夾

  1. ServletContext

遺憾的是,Java的標準java.net.URL類和各種URL前綴的標準處理程序不足以完全訪問低級資源。 例如管引,沒有標準化的URL實現(xiàn)可用于訪問需要從類路徑或相對于ServletContext獲取的資源赚爵。 雖然可以為專用URL前綴注冊新的處理程序(類似于http :)這樣的前綴的現(xiàn)有處理程序瓢湃,但這通常非常復雜矢炼,并且URL接口仍然缺少一些理想的功能斤葱,例如檢查存在的方法 被指向的資源慷垮。

資源路徑:

應用的類路徑:classpath:

操作系統(tǒng)的文件路徑: FileSystemXmlApplicationContext:

Url路徑: file: for accessing filesystem paths, http: for accessing resources via the HTTP protocol, ftp: for accessing resources via FTP, etc.

ApplicationContext

  1. ClassPathXmlApplicationContext
  2. FileSystemXmlApplicationContext

Spring的Resource接口旨在成為一個更強大的接口,用于抽象對低級資源的訪問揍堕。

6.3 Built-in Resource implementations

6.3.1 UrlResource

UrlResource包裝java.net.URL料身,可用于訪問通常可通過URL訪問的任何對象衩茸,例如文件芹血,HTTP目標,F(xiàn)TP目標等递瑰。所有URL都具有標準化的字符串表示形式祟牲,例如適當?shù)臉藴驶熬Y用于表示來自另一個的一種URL類型隙畜。這包括文件:用于訪問文件系統(tǒng)路徑抖部,http:用于通過HTTP協(xié)議訪問資源,ftp:用于通過FTP訪問資源等议惰。

UrlResource是由Java代碼使用UrlResource構(gòu)造函數(shù)顯式創(chuàng)建的慎颗,但是當您調(diào)用API方法時,通常會隱式創(chuàng)建它,該方法接受一個表示路徑的String參數(shù)俯萎。對于后一種情況傲宜,JavaBeans PropertyEditor最終將決定要創(chuàng)建哪種類型的Resource。如果路徑字符串包含一些眾所周知的(對于它)前綴夫啊,例如classpath:函卒,它將為該前綴創(chuàng)建適當?shù)膶S觅Y源。但是撇眯,如果它無法識別前綴报嵌,則會假定這只是一個標準的URL字符串,并將創(chuàng)建一個UrlResource熊榛。

6.3.2 ClassPathResource

此類表示應從類路徑獲取的資源锚国。 這使用線程上下文類加載器,給定的類加載器或給定的類來加載資源玄坦。

如果類路徑資源駐留在文件系統(tǒng)中血筑,則此Resource實現(xiàn)支持解析為java.io.File,但不支持駐留在jar中且尚未擴展(通過servlet引擎或任何環(huán)境)的類路徑資源的解析 文件系統(tǒng)煎楣。 為了解決這個問題豺总,各種Resource實現(xiàn)始終支持作為java.net.URL的解析。

ClassPathResource是由Java代碼使用ClassPathResource構(gòu)造函數(shù)顯式創(chuàng)建的择懂,但是當您調(diào)用一個API方法時园欣,它通常會隱式創(chuàng)建,該方法接受一個表示路徑的String參數(shù)休蟹。 對于后一種情況沸枯,JavaBeans PropertyEditor將識別字符串路徑上的特殊前綴classpath:并在此情況下創(chuàng)建ClassPathResource。

class loader 加載資源

6.3.3 FileSystemResource

6.3.4 ServletContextResource

6.3.4 ServletContextResource
這是ServletContext資源的Resource實現(xiàn)赂弓,用于解釋相關(guān)Web應用程序根目錄中的相對路徑绑榴。

這始終支持流訪問和URL訪問,但僅在擴展Web應用程序存檔且資源實際位于文件系統(tǒng)上時才允許java.io.File訪問盈魁。 它是否在這樣的文件系統(tǒng)上展開翔怎,或直接從JAR或其他地方(如DB)(可以想象)訪問,實際上是依賴于Servlet容器杨耙。

6.3.5 InputStreamResource

給定InputStream的Resource實現(xiàn)赤套。 只有在沒有適用的特定資源實現(xiàn)時才應使用此方法。 特別是珊膜,在可能的情況下容握,更喜歡ByteArrayResource或任何基于文件的資源實現(xiàn)。

與其他Resource實現(xiàn)相比车柠,這是已打開資源的描述符 - 因此從isOpen()返回true剔氏。 如果需要將資源描述符保留在某處塑猖,或者需要多次讀取流,請不要使用它谈跛。

6.3.6 ByteArrayResource

這是給定字節(jié)數(shù)組的Resource實現(xiàn)羊苟。 它為給定的字節(jié)數(shù)組創(chuàng)建一個ByteArrayInputStream。

它對于從任何給定的字節(jié)數(shù)組加載內(nèi)容非常有用感憾,而無需使用一次性使用的InputStreamResource蜡励。

6.4 The ResourceLoader

ResourceLoader接口旨在由可以返回(即加載)Resource實例的對象實現(xiàn)。

所有應用程序上下文都實現(xiàn)ResourceLoader接口阻桅,因此可以使用所有應用程序上下文來獲取Resource實例巍虫。

當您在特定應用程序上下文上調(diào)用getResource()并且指定的位置路徑?jīng)]有特定前綴時,您將返回適合該特定應用程序上下文的Resource類型鳍刷。 例如占遥,假設針對ClassPathXmlApplicationContext實例執(zhí)行了以下代碼片段:

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

將返回的是ClassPathResource; 如果對FileSystemXmlApplicationContext實例執(zhí)行相同的方法,則會返回FileSystemResource输瓜。 對于WebApplicationContext瓦胎,您將獲得ServletContextResource,依此類推尤揣。

因此搔啊,您可以以適合特定應用程序上下文的方式加載資源。

另一方面北戏,您也可以通過指定特殊的類路徑來強制使用ClassPathResource负芋,而不管應用程序上下文類型如何:prefix:

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");

類似地,可以通過指定任何標準java.net.URL前綴來強制使用UrlResource:

Resource template = ctx.getResource("file:/some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("http://myhost.com/resource/path/myTemplate.txt");

下表總結(jié)了將字符串轉(zhuǎn)換為資源的策略:

https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/resources.html#resources-resourceloader

6.5 The ResourceLoaderAware interface

當類實現(xiàn)ResourceLoaderAware并部署到應用程序上下文(作為Spring管理的bean)時嗜愈,它被應用程序上下文識別為ResourceLoaderAware旧蛾。 然后,應用程序上下文將調(diào)用setResourceLoader(ResourceLoader)蠕嫁,將其自身作為參數(shù)提供(請記住锨天,Spring中的所有應用程序上下文都實現(xiàn)了ResourceLoader接口)。

當然剃毒,由于ApplicationContext是一個ResourceLoader病袄,bean也可以實現(xiàn)ApplicationContextAware接口并直接使用提供的應用程序上下文來加載資源,但一般情況下赘阀,最好使用專用的ResourceLoader接口益缠,如果只需要它。 代碼只會耦合到資源加載接口基公,可以將其視為實用程序接口幅慌,而不是整個Spring ApplicationContext接口。

從Spring 2.5開始酌媒,您可以依賴ResourceLoader的自動裝配作為實現(xiàn)ResourceLoaderAware接口的替代方法欠痴。 “傳統(tǒng)”構(gòu)造函數(shù)和byType自動裝配模式(如第5.4.5節(jié)“自動裝配協(xié)作者”中所述)現(xiàn)在能夠分別為構(gòu)造函數(shù)參數(shù)或setter方法參數(shù)提供ResourceLoader類型的依賴項。 為了獲得更大的靈活性(包括自動裝配字段和多參數(shù)方法的能力)秒咨,請考慮使用新的基于注釋的自動裝配功能喇辽。 在這種情況下,只要有問題的字段雨席,構(gòu)造函數(shù)或方法帶有@Autowired注釋菩咨,ResourceLoader就會自動裝入一個期望ResourceLoader類型的字段,構(gòu)造函數(shù)參數(shù)或方法參數(shù)陡厘。 有關(guān)更多信息抽米,請參見第5.9.2節(jié)“@Autowired”。

6.6 Resources as dependencies

如果bean本身將通過某種動態(tài)過程確定并提供資源路徑糙置,那么bean使用ResourceLoader接口加載資源可能是有意義的云茸。 以某種模板的加載為例,其中所需的特定資源取決于用戶的角色谤饭。 如果資源是靜態(tài)的标捺,那么完全消除ResourceLoader接口的使用是有意義的,只需讓bean公開它需要的Resource屬性揉抵,并期望它們被注入到它中亡容。

然后注入這些屬性變得微不足道的是,所有應用程序上下文都注冊并使用特殊的JavaBeans PropertyEditor冤今,它可以將String路徑轉(zhuǎn)換為Resource對象闺兢。 因此,如果myBean具有Resource類型的模板屬性戏罢,則可以使用該資源的簡單字符串進行配置屋谭,如下所示:

<bean id="myBean" class="...">
<property name="template" value="some/resource/path/myTemplate.txt"/>
</bean>

請注意,資源路徑?jīng)]有前綴龟糕,因為應用程序上下文本身將用作ResourceLoader戴而,資源本身將通過ClassPathResource,F(xiàn)ileSystemResource或ServletContextResource(根據(jù)需要)加載翩蘸,具體取決于上下文的確切類型所意。

如果需要強制使用特定的資源類型,則可以使用前綴催首。 以下兩個示例顯示如何強制ClassPathResource和UrlResource(后者用于訪問文件系統(tǒng)文件)扶踊。

<property name="template" value="classpath:some/resource/path/myTemplate.txt">

<property name="template" value="file:/some/resource/path/myTemplate.txt"/>

6.7 Application contexts and Resource paths

6.7.1 Constructing application contexts

應用程序上下文構(gòu)造函數(shù)(對于特定的應用程序上下文類型)通常將字符串或字符串數(shù)組作為資源的位置路徑(例如構(gòu)成上下文定義的XML文件)。

當這樣的位置路徑?jīng)]有前綴時郎任,從該路徑構(gòu)建并用于加載bean定義的特定資源類型依賴于并且適合于特定的應用程序上下文秧耗。 例如,如果您創(chuàng)建ClassPathXmlApplicationContext舶治,如下所示:

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

bean定義將從類路徑加載分井,因為將使用ClassPathResource车猬。 但是,如果您按如下方式創(chuàng)建FileSystemXmlApplicationContext:

ApplicationContext ctx =
new FileSystemXmlApplicationContext("conf/appContext.xml");

bean定義將從文件系統(tǒng)位置加載尺锚,在這種情況下相對于當前工作目錄珠闰。

請注意,在位置路徑上使用特殊類路徑前綴或標準URL前綴將覆蓋為加載定義而創(chuàng)建的默認Resource類型瘫辩。 所以這個FileSystemXmlApplicationContext ......

ApplicationContext ctx =
new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");

...實際上將從類路徑加載其bean定義伏嗜。 但是,它仍然是FileSystemXmlApplicationContext伐厌。 如果它隨后用作ResourceLoader承绸,則任何未加前綴的路徑仍將被視為文件系統(tǒng)路徑。

6.7.2 Wildcards in application context constructor resource paths

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挣轨,一起剝皮案震驚了整個濱河市军熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卷扮,老刑警劉巖羞迷,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異画饥,居然都是意外死亡衔瓮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門抖甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热鞍,“玉大人,你說我怎么就攤上這事衔彻∞背瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵艰额,是天一觀的道長澄港。 經(jīng)常有香客問我,道長柄沮,這世上最難降的妖魔是什么回梧? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祖搓,結(jié)果婚禮上狱意,老公的妹妹穿的比我還像新娘。我一直安慰自己拯欧,他們只是感情好详囤,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镐作,像睡著了一般藏姐。 火紅的嫁衣襯著肌膚如雪隆箩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天羔杨,我揣著相機與錄音捌臊,去河邊找鬼。 笑死问畅,一個胖子當著我的面吹牛娃属,可吹牛的內(nèi)容都是我干的六荒。 我是一名探鬼主播护姆,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掏击!你這毒婦竟也來了卵皂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砚亭,失蹤者是張志新(化名)和其女友劉穎灯变,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捅膘,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡添祸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寻仗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃泌。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖署尤,靈堂內(nèi)的尸體忽然破棺而出耙替,到底是詐尸還是另有隱情,我是刑警寧澤曹体,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布俗扇,位于F島的核電站,受9級特大地震影響箕别,放射性物質(zhì)發(fā)生泄漏铜幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一串稀、第九天 我趴在偏房一處隱蔽的房頂上張望啥酱。 院中可真熱鬧,春花似錦厨诸、人聲如沸镶殷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绘趋。三九已至颤陶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陷遮,已是汗流浹背滓走。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帽馋,地道東北人搅方。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像绽族,于是被迫代替她去往敵國和親姨涡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • Spring框架大量使用了Resource來訪問底層資源。Resource接口提供的方法: getInputStr...
    數(shù)獨題閱讀 1,463評論 0 3
  • 1.介紹 java標準的 java.net.URL類和用于各種前綴標準處理程序并不滿足訪問底層資源检诗,例如匈仗, 沒有...
    Mrsunup閱讀 741評論 0 0
  • 深入使用 Spring兩種后處理器Bean 后處理器容器后處理器屬性占位符配置器重寫占位符配置器Spring 的自...
    漸丶忘閱讀 1,097評論 0 1
  • 資源抽象接口(Resource) ??JDK所提供的訪問資源的類(如java.net.URL,F(xiàn)ile等)并不能很...
    yeren108閱讀 1,360評論 0 0
  • 今天的愿望是 生我養(yǎng)我的愛我的我愛的麻麻能健健康康活到100歲 那個陪我看電影的姑娘要一直一直開心逢慌,幸福悠轩,還有下一...
    啦啦啦種太陽_3708閱讀 96評論 0 0