classpath: spring 中的查找方式

Spring可以通過指定classpath*:與classpath:前綴加路徑的方式從classpath加載文件,如bean的定義文件.classpath*:的出現是為了從多個jar文件中加載相同的文件.classpath:只能加載找到的第一個文件.

比如 resource1.jar中的package 'com.test.rs' 有一個 'jarAppcontext.xml' 文件,內容如下:

<bean name="ProcessorImplA" class="com.test.spring.di.ProcessorImplA" />

resource2.jar中的package 'com.test.rs' 也有一個 'jarAppcontext.xml' 文件,內容如下:

<bean id="ProcessorImplB" class="com.test.spring.di.ProcessorImplB" />

通過使用下面的代碼則可以將兩個jar包中的文件都加載進來

ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath*:com/test/rs/jarAppcontext.xml");

而如果寫成下面的代碼,就只能找到其中的一個xml文件(順序取決于jar包的加載順序)

ApplicationContext ctx = new ClassPathXmlApplicationContext( "classpath:com/test/rs/jarAppcontext.xml");

classpath*:的使用是為了多個component(最終發布成不同的jar包)并行開發,各自的bean定義文件按照一定的規則:package+filename,而使用這些component的調用者可以把這些文件都加載進來.

classpath*:的加載使用了classloader的 getResources() 方法,如果是在不同的J2EE服務器上運行,由于應用服務器提供自己的classloader實現,它們在處理jar文件時的行為也許會有所不同。 要測試classpath*: 是否有效,可以用classloader從classpath中的jar文件里加載文件來進行測試:getClass().getClassLoader().getResources("<someFileInsideTheJar>")。(上面的例子是在sun的jre中運行的狀態)

?從Spring的源碼,在PathMatchingResourcePatternResolver類中,我們可以更清楚的了解其對的處理:如果是以classpath*開頭,它會遍歷classpath.

[java] view plaincopy
  1. protected?Resource[]?findAllClassPathResources(String?location)?throws?IOException?{??
  2. ????String?path?=?location;??
  3. ????if?(path.startsWith("/"))?{??
  4. ????????path?=?path.substring(1);??
  5. ????}??
  6. ????Enumeration?resourceUrls?=?getClassLoader().getResources(path);??
  7. ????Set<Resource>?result?=?new?LinkedHashSet<Resource>(16);??
  8. ????while?(resourceUrls.hasMoreElements())?{??
  9. ????????URL?url?=?(URL)?resourceUrls.nextElement();??
  10. ????????result.add(convertClassLoaderURL(url));??
  11. ????}??
  12. ????return?result.toArray(new?Resource[result.size()]);??
  13. }??

http://blog.csdn.net/kkdelta/article/details/5560210,簡介了在JAVA里遍歷classpath中讀取找到的所有符合名稱的文件.

另外在加載resource的時候,其他前綴的意義如下表所示:注意classpath*只能用與指定配置文件的路徑,不能用在用于 getResource的參數.如 appContext.getResource("classpath*:conf/bfactoryCtx.xml")會異常的.

前綴例子說明

classpath:

classpath:com/myapp/config.xml

從classpath中加載。

file:

file:/data/config.xml

作為 URL 從文件系統中加載。

http:

http://myserver/logo.png

作為 URL 加載。

(none)

/data/config.xml

根據 ApplicationContext 進行判斷。

從Spring的源碼可以看出原因:如果是classpath:開頭,從classpath加載,否則嘗試URL,如果失敗,調用 getResourceByPath

[java] view plaincopy
  1. public?Resource?getResource(String?location)?{??
  2. ????????Assert.notNull(location,?"Location?must?not?be?null");??
  3. ????????if?(location.startsWith(CLASSPATH_URL_PREFIX))?{??
  4. ????????????return?new?ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()),?getClassLoader());??
  5. ????????}??
  6. ????????else?{??
  7. ????????????try?{??
  8. ????????????????//?Try?to?parse?the?location?as?a?URL...??
  9. ????????????????URL?url?=?new?URL(location);??
  10. ????????????????return?new?UrlResource(url);??
  11. ????????????}??
  12. ????????????catch?(MalformedURLException?ex)?{??
  13. ????????????????//?No?URL?->?resolve?as?resource?path.??
  14. ????????????????return?getResourceByPath(location);??
  15. ????????????}??
  16. ????????}??
  17. ????}??


getResourceByPath會被不同ApplicationContext 實現覆蓋.

如 GenericWebApplicationContext覆蓋為如下:

[java] view plaincopy
  1. protected?Resource?getResourceByPath(String?path)?{??
  2. ????????return?new?ServletContextResource(this.servletContext,?path);??
  3. ????}??
  4. ??
  5. 如?FileSystemXmlApplicationContext覆蓋為如下:??
  6. ??
  7. protected?Resource?getResourceByPath(String?path)?{??
  8. ????????if?(path?!=?null?&&?path.startsWith("/"))?{??
  9. ????????????path?=?path.substring(1);??
  10. ????????}??
  11. ????????return?new?FileSystemResource(path);??
  12. ????}??

最終從文件加載的時候仍然是JAVA中常見的讀取文件的方法:

如ClassPathResource得到inputstream的方法是利用class loader.

[java] view plaincopy
  1. public?InputStream?getInputStream()?throws?IOException?{??
  2. ????InputStream?is;??
  3. ????if?(this.clazz?!=?null)?{??
  4. ????????is?=?this.clazz.getResourceAsStream(this.path);??
  5. ????}??

如FileSystemResource得到inputstream的方法是利用FileInputStream.

??? public InputStream getInputStream() throws IOException {
?? ??? ?return new FileInputStream(this.file);
?? ?}

如ServletContextResource得到inputstream的方法是利用servletContext.getResourceAsStream.

[java] view plaincopy
    1. public?InputStream?getInputStream()?throws?IOException?{??
    2. ????InputStream?is?=?this.servletContext.getResourceAsStream(this.path);??
    3. ????if?(is?==?null)?{??
    4. ????????throw?new?FileNotFoundException("Could?not?open?"?+?getDescription());??
    5. ????}??
    6. ????return?is;??
    7. }?

轉載于:https://www.cnblogs.com/1995hxt/p/5800257.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254601.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254601.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《高效程序員的45個習慣》-之一

敏捷開發是當下最流行的開發方法&#xff0c;它采用的是一種以人為核心、迭代、循序漸進的開發思想&#xff0c;值得你關注和學習。 最近我就閱讀了一本有關敏捷開發的書籍&#xff0c;《高效程序員的45個習慣》。 它以“舉反例”的方式來講述了敏捷開發中程序員應該運用的…

教你如何在 elasticsearch 中重建索引

序言 Elasticsearch 是一個實時的分布式搜索分析引擎。Teambition 使用 Elastisearch 作為搜索引擎&#xff0c;為用戶提供搜索服務&#xff0c;當我們決定存儲某種數據時&#xff0c;我們需要使用PUT /teambition創建索引&#xff0c;在創建索引的時候需要將數據結構完整確定下…

halcon控制算子Control,持續更新

目錄Controlassignassign_atbreakcasecatchcommentcontinueconvert_tuple_to_vector_1dconvert_vector_to_tupledefaultelseelseifendforendifendswitchendtryendwhileexecutable_expressionexitexport_defforglobalififelseimportinsertpar_joinrepeatreturnstopswitchthrowtr…

《CLR via C#》之線程處理——線程基礎

《CLR via C#》之線程處理——線程基礎 《CLR via C#》之線程處理——線程基礎windows為什么要支持線程線程開銷CPU發展趨勢CLR線程和Windows線程使用專用線程執行異步的計算限制操作線程調度和優先級windows為什么要支持線程 早期的操作系統只有一個執行線程&#xff0c;但同時…

《高效程序員的45個習慣》-之二

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之一。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

MIME Type的介紹

轉載自&#xff1a; http://www.cnblogs.com/jsean/articles/1610265.html 一、 首先&#xff0c;我們要了解瀏覽器是如何處理內容的。在瀏覽器中顯示的內容有 HTML、有 XML、有 GIF、還有 Flash ……那么&#xff0c;瀏覽器是如何區分它們&#xff0c;決定什么內容用什么形式來…

spring boot之從零開始開發自己的網站

概述 首先要感謝兩位大神&#xff0c;該項目的想法來源自tale和MyBlog。 做了一些改造&#xff0c;增加了一些功能和一些代碼的重構&#xff0c;并且更換了博客主題。 關于項目&#xff0c;對于開發的練手項目&#xff0c;能夠工程化&#xff0c;嚴謹一些。 關于文檔&#x…

halcon深度學習算子,持續更新

目錄Deep Learning 深度學習Classification&#xff1a;分類apply_dl_classifierclear_dl_classifierclear_dl_classifier_resultclear_dl_classifier_train_resultdeserialize_dl_classifierget_dl_classifier_paramget_dl_classifier_resultget_dl_classifier_train_resultre…

python day5--正則表達式

#----正則表達式 import re elink <a href"(.*)">(.*)</a> info <a href"http://www.baidu.com">baidu</a> cinfo re.findall(elink,info) print (cinfo) import re print(re.search (r^a,abc\neee)) #預期結果 ^匹配字符開…

WCF系列教程之WCF客戶端調用服務

1、創建WCF客戶端應用程序需要執行下列步驟 (1)、獲取服務終結點的服務協定、綁定以及地址信息 (2)、使用該信息創建WCF客戶端 (3)、調用操作 (4)、關閉WCF客戶端對象 二、操作實例 1、WCF服務層搭建:新建契約層、服務層、和WCF宿主,添加必須的引用(這里不會的參考本人前面的隨…

《高效程序員的45個習慣》-之三

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之二。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

負載均衡的那些事?

什么是負載均衡&#xff1f;1、負載&#xff1a;就是后端系統的承載能力。比如同等條件下&#xff0c;一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差&#xff1b;相同配置下&#xff0c;一個cpu利用率為80%的機器比30%的承載能力一般要差等等。2、均衡&am…

Develop內部函數,持續更新

Develop內部函數 目錄Develop內部函數dev_clear_objdev_clear_windowdev_close_inspect_ctrldev_close_tooldev_close_windowdev_disp_textdev_displaydev_error_vardev_get_exception_datadev_get_preferencesdev_get_systemdev_get_windowdev_inspect_ctrldev_map_pardev_map…

短信認證方案,用手機短信進行上網認證如何實現?

WFilter NGF的“Web認證”模塊&#xff0c;提供了一系列的上網認證解決方案。包括如下認證方式&#xff1a;本地用戶名密碼認證AD域用戶名密碼認證企業郵箱用戶名密碼認證Radius用戶名密碼認證微信WiFi認證Facebook Wifi認證除此&#xff0c;WFilter NGF還有一個“其他”的選項…

《高效程序員的45個習慣》-末篇

請您在閱讀本文之前&#xff0c;先了解《高效程序員的45個習慣》-之三。 每一期都會涉及15個話題&#xff0c;用3期來列出這45個習慣&#xff0c;每次不貪多&#xff0c;貪精&#xff0c;大家如果有空&#xff0c;一定要細細品味這15個習慣。 注意&#xff1a;每一個好的習…

【Qt開發】V4L2 API詳解 Buffer的準備和數據讀取

前面主要介紹的是&#xff1a;V4L2 的一些設置接口&#xff0c;如亮度&#xff0c;飽和度&#xff0c;曝光時間&#xff0c;幀數&#xff0c;增益&#xff0c;白平衡等。今天看看V4L2 得到數據的幾個關鍵ioctl&#xff0c;Buffer的申請和數據的抓取。1. 初始化 Memory Mapping …

halcon File文件算子,持續更新

目錄File文件Images圖像read_imageread_sequencewrite_imagedeserialize_imageserialize_imagelist_image_fileparse_filenameMisc混合體copy_filedelete_filefile_existsget_current_dirlist_filesmake_dirread_world_fileremove_dirset_current_dirObject對象deserialize_obj…

Nginx 之一:編譯安裝nginx 1.8.1 及配置

轉http://www.cnblogs.com/zhang-shijie/p/5294162.html 一&#xff1a;基介紹 官網地址www.nginx.org&#xff0c;nginx是由1994年畢業于俄羅斯國立莫斯科鮑曼科技大學的同學為俄羅斯rambler.ru公司開發的&#xff0c;開發工作最早從2002年開始&#xff0c;第一次公開發布時間…

PI校正環節的程序實現推導過程

PI校正環節在經典控制論中非常有用&#xff0c;特別是對負反饋控制系統&#xff0c;基本上都有PI校正環節。1.下面分別說明比例環節和積分環節的作用&#xff0c;以階躍信號為例。①比例環節單獨作用以上分析說明&#xff0c;若只有比例環節的控制系統&#xff0c;階躍響應也是…

XML文檔注釋(C#)

目錄XML文檔編譯器識別的標記添加XLM注釋的方法添加XLM注釋的例子XML文檔 C#可以根據特定的注釋自動創建XML格式的文檔說明。 這些注釋都是單行注釋&#xff0c;但都以三條斜杠開頭 編譯器識別的標記 標記說明<C>把行中的文本標記為代碼&#xff0c;例如<c>int …