Spring PathMatchingResourcePatternResolver
PathMatchingResourcePatternResolver是ResourcePatternResolver的實現來,用來解析一個或多個匹配資源的指定資源位置路徑,資源路徑可能是唯一的,也可能是包含classpath*:前綴,或者匹配Ant風格的特殊表達式。
比如 file:C:/context.xml,classpathZ:/context.xml,/WEB-INF/context.xml,將會返回一個resource實例對象
繼承體系參考:資源訪問
其主要屬性如下
//主要用於程序運行狀態中,動態獲取方法的信息
@Nullable
private static Method equinoxResolveMethod;
//資源加載類
private final ResourceLoader resourceLoader;
//用來匹配Ant風格的匹配規則
private PathMatcher pathMatcher = new AntPathMatcher();
//根據給定的資源路徑或Ant風格的路徑匹配符合的資源文件加載為Resource對象
@Override
public Resource[] getResources(String locationPattern) throws IOException {
Assert.notNull(locationPattern, "Location pattern must not be null");
//判斷是否以classpath*開頭
if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
// a class path resource (multiple resources for same name possible)
if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
//根據Ant風格給定的字符串路徑匹配所有的資源對象
return findPathMatchingResources(locationPattern);
}
else {
// 查找所classpath路徑下的符合規則的資源
return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
}
}
else {
// 如果路徑資源以war:開頭,則執行如下加載資源的方法
int prefixEnd = (locationPattern.startsWith("war:") ? locationPattern.indexOf("*/") + 1 :
locationPattern.indexOf(':') + 1);
if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
// a file pattern
return findPathMatchingResources(locationPattern);
}
else {
// a single resource with the given name
return new Resource[] {getResourceLoader().getResource(locationPattern)};
}
}
}
測試如下:
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
@Test
public void testfindPathMatchingResources() throws Exception {
Resource[] resource = pathMatchingResourcePatternResolver.getResources("classpath*:/config/*.txt");
for (int i = 0; i < resource.length; i++) {
String filename = resource[i].getFilename();
URL url = resource[i].getURL();
System.out.println(url);
}
// System.out.println(resource);
}