这个类的主要作用是根据路径的开头,返回不同的Resource。比如ClassPathContextResource、ClassPathResource、UrlResource。
类层次图
接口中方法,返回值Resource在第四篇有解析
public interface ResourceLoader {
String CLASSPATH_URL_PREFIX = "classpath:";
Resource getResource(String var1);
ClassLoader getClassLoader();
}
子接口
public interface ResourcePatternResolver extends ResourceLoader {
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";
Resource[] getResources(String var1) throws IOException;
}
PathMatchingResourcePatternResolver类中常用构造方法为
public PathMatchingResourcePatternResolver() {
this.resourceLoader = new DefaultResourceLoader();
}
它委托DefaultResourceLoader来执行具体的解析操作:
- 如果有设置解析器,则使用设置的解析器解析。没有,则往下走
- 根据路径的开头判断返回哪种resource
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
Iterator var2 = this.protocolResolvers.iterator();
Resource resource;
do {
if(!var2.hasNext()) {
if(location.startsWith("/")) {
return this.getResourceByPath(location);//new DefaultResourceLoader.ClassPathContextResource(path, this.getClassLoader());
}
if(location.startsWith("classpath:")) {
return new ClassPathResource(location.substring("classpath:".length()), this.getClassLoader());
}
try {
URL url = new URL(location);
return new UrlResource(url);
} catch (MalformedURLException var5) {
return this.getResourceByPath(location);
}
}
ProtocolResolver protocolResolver = (ProtocolResolver)var2.next();
resource = protocolResolver.resolve(location, this);
} while(resource == null);
return resource;
}