在寫Java代碼時,有很多場景需要用到從classpath中加載資源。
使用Spring時,定義了比較方便的前綴風格告訴程序從哪裏加載。
比較常用的有classpath:和classpath*:兩種前綴,用於指定從classpath中加載資源。但兩者有些細微差別。
以加載Spring的配置文件爲例,以下的寫法大家應該比較熟悉:
- ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {
- "classpath:META-INF/spring/a.bean.xml",
- "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類來來幫你定位一下,程序到底從哪裏加載進來的你指定的配置文件,實例代碼如下:
- try {
- for (Resource r : new PathMatchingResourcePatternResolver().getResources("your_locationPattern")){
- System.out.println("The real path is : "+r.getFile().getAbsolutePath());
- }
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }