Spring中關於classpath:和classpath*:前綴的一個小問題



在寫Java代碼時,有很多場景需要用到從classpath中加載資源。

使用Spring時,定義了比較方便的前綴風格告訴程序從哪裏加載。

比較常用的有classpath:和classpath*:兩種前綴,用於指定從classpath中加載資源。但兩者有些細微差別。

 

以加載Spring的配置文件爲例,以下的寫法大家應該比較熟悉:

Java代碼 複製代碼 收藏代碼
  1. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {  
  2.                 "classpath:META-INF/spring/a.bean.xml",  
  3.                  "classpath*:META-INF/spring/b.bean.xml" });  
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {
                "classpath:META-INF/spring/a.bean.xml",
                 "classpath*:META-INF/spring/b.bean.xml" });
 

兩種寫法是希望在當前程序的classpath下去加載META-INF/spring/a.bean.xml和META-INF/spring/b.bean.xml。

但請注意,前者沒有*作爲前綴,在classpath下面找不到META-INF/spring/a.bean.xml時,程序會馬上拋出FileNotFoundException,提示你文件找不到,這種Fail Fast的風格,在定位問題的時候可能很有幫助。

後者因爲加上了*通配符,所以即使在classpath下面找不到META-INF/spring/b.bean.xml時,程序只會偷偷忍掉,不做任何錯誤提示。當然,這在某些特定的場景下,可能也是有意義的。

 

所以根據不同的使用場景,這兩點區別可能需要注意一下。

另外,當某些時候,你懷疑Spring的某些配置文件加載的不對的時候,可以通過spring類庫中提供的PathMatchingResourcePatternResolver類來來幫你定位一下,程序到底從哪裏加載進來的你指定的配置文件,實例代碼如下:

 

Java代碼 複製代碼 收藏代碼
  1. try {  
  2.     for (Resource r : new PathMatchingResourcePatternResolver().getResources("your_locationPattern")){  
  3.         System.out.println("The real path is : "+r.getFile().getAbsolutePath());  
  4.     }  
  5. catch (IOException e1) {  
  6.     // TODO Auto-generated catch block  
  7.     e1.printStackTrace();  
  8. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章