1. 程式人生 > >Spring antmatcher 使用路徑萬用字元載入Resource,

Spring antmatcher 使用路徑萬用字元載入Resource,

Spring提供了強大的Ant模式萬用字元匹配,從同一個路徑能匹配一批資源。

Ant路徑萬用字元支援"?"、"*"、"**",注意萬用字元匹配不包括目錄分隔符“/”。

“?”:匹配一個字元,如"config?.xml"可匹配"config1.xml".

“*”:匹配零個或多個字串,如“com/*/config.xml”將匹配“cn/feng/config.xml”,但不匹配匹配“com/config.xml”(因為這裡匹配的是字串,如果是目錄的話則可以);而“com/config-*.xml”將匹配“com/config-dao.xml”;

"**":匹配路徑中的零個或多個目錄。如“com/**/config.xml”將匹配“com/config.xml”,也匹配“com/feng/spring/config.xml”;而“com/feng/config-**.xml”將匹配“com/feng/config-dao.xml”,即把“**”當做兩個“*”處理。

Spring在載入類路徑資源時除了提供字首“classpath:”的來支援載入一個Resource,還提供一個字首“classpath*:”來支援載入所有匹配的類路徑Resource。

Spring提供了ResourcePatternResolver介面來載入多個Resource.

  1. package com.feng.spring.chapter2.helloworld;  
  2. import java.io.IOException;  
  3. import org.springframework.core.io.Resource;  
  4. import org.springframework.core.io.ResourceLoader;  
  5. publicinterface ResourcePatternResolver extends ResourceLoader{  
  6.     String CLASSPATH_ALL_URL_PREFIX = "classpath*:";  
  7.     Resource[] getResources(String locationPattern) throws IOException;//添加了此方法用來接收多個Resource
  8. }  

一、"classpath":用於載入類路徑(包括jar包)中的一個且僅一個資源;對於多個匹配的也只返回一個。如果需要多個匹配的則考慮"classpath*."字首。
  1. package com.feng.spring.chapter2.helloworld;  
  2. import java.io.IOException;  
  3. import org.junit.Test;  
  4. import org.springframework.core.io.Resource;  
  5. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;  
  6. publicclass HelloTest {  
  7.         @Test
  8.         publicvoid testClasspathPrefix()throws IOException{  
  9.             ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();  
  10.             //只加載一個絕對匹配Resource,且通過ResourceLoader.getResource進行載入
  11.             Resource resources=resolver.getResource("classpath:META-INF/INDEX.LIST");  
  12.              Assert.assertEquals(1, resources.length);  
  13.             //只加載一個匹配的Resource,且通過ResourceLoader.getResource進行載入
  14.              resources = resolver.getResource("classpath:META-INF/*.LIST");  
  15.              Assert.assertTrue(resources.length == 1);   
  16.         }  
  17. }  

二、"classpath*":

用於載入類路徑(包括jar包)中所有的匹配的資源。

  1. package com.feng.spring.chapter2.helloworld;  
  2. import java.io.IOException;  
  3. import javax.annotation.Resource;  
  4. import junit.framework.Assert;  
  5. import org.junit.Test;  
  6. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;  
  7. publicclass HelloTest {  
  8.         @Test
  9.         publicvoid testClasspathAsteriskPrefix()throws IOException{  
  10.             ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();  
  11.             //將載入多個絕對匹配的所有Resource
  12.             //將首先通過ClassLoader.getResource("META-INF")載入非模式路徑部分
  13.             //然後進行遍歷模式匹配
  14.             Resource[] resources = (Resource[]) resolver.getResources("classpath*:META-INF/INDEX.LIST");   
  15.             Assert.assertTrue(resources.length > 1);    
  16.             //將載入多個模式匹配的Resource
  17.             resources = (Resource[]) resolver.getResources("classpath*:META-INF/*.LIST");  
  18.              Assert.assertTrue(resources.length > 1);     
  19.         }  
  20. }  


帶萬用字元的classpath使用“ClassLoader”的“Enumeration<URLgetResources(String name)”方法來查詢萬用字元之前的資源,然後通過模式匹配來獲取匹配的資源。如“classpath:META-INF/*.LIST”將首先載入萬用字元之前的目錄“META-INF”,然後再遍歷路徑進行子路徑匹配從而獲取匹配的資源。

三、"file":載入一個或多個系統中的Resource。如:"file:D/*.txt"將返回D盤下的所有txt檔案。

四、無字首:通過ResourceLoader實現載入一個資源。

ApplicationContext提供的getResource方法將獲取資源委託給ResourcePatternResolver實現,預設使用PathMatingResourcePatternResolver.