概述
1.1 ResourceLoader方法:
public interface ResourceLoader {
// classPath 路径
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
// 根据路径返回资源对象
Resource getResource(String location);
// 返回 ClassLoader 实例
@Nullable
ClassLoader getClassLoader();
}
1.2 DefaultResourceLoader
org.springframework.core.io.DefaultResourceLoader 是 ResourceLoader 的默认实现。
public class DefaultResourceLoader implements ResourceLoader {
@Nullable
private ClassLoader classLoader;
private final Set<ProtocolResolver> protocolResolvers = new LinkedHashSet<>(4);
private final Map<Class<?>, Map<Resource, ?>> resourceCaches = new ConcurrentHashMap<>(4);
// 默认无参构造:创建一个默认的 ClassLoader
public DefaultResourceLoader() {
this.classLoader = ClassUtils.getDefaultClassLoader();
}
// 含参构造:可以传递指定的 ClassLoader
public DefaultResourceLoader(@Nullable ClassLoader classLoader) {
this.classLoader = classLoader;
}
// 扩展方法:可以将自定义的 Resolver 加入 Spring
public void addProtocolResolver(ProtocolResolver resolver) {
Assert.notNull(resolver, "ProtocolResolver must not be null");
this.protocolResolvers.add(resolver);
}
// 返回已经注册过的 resolvers
public Collection<ProtocolResolver> getProtocolResolvers() {
return this.protocolResolvers;
}
// ResourceLoader 中最核心的方法
@Override
public Resource getResource(String location) {
Assert.notNull(location, "Location must not be null");
// 通过 getProtocolResolvers 来加载资源
for (ProtocolResolver protocolResolver : getProtocolResolvers()) {
Resource resource = protocolResolver.resolve(location, this);
if (resource != null) {
return resource;
}
}
if (location.startsWith("/")) {
// 以 / 开头,返回 ClassPathContextResource
return getResourceByPath(location);
}
else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
// 以 classpath: 开头,返回 ClassPathResource
return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
}
else {
try {
// Try to parse the location as a URL...
// 根据是否为文件 URL ,是则返回 FileUrlResource ,否则返回 UrlResource
URL url = new URL(location);
return (ResourceUtils.isFileURL(url) ? new FileUrlResource(url) : new UrlResource(url));
}
catch (MalformedURLException ex) {
// 返回 ClassPathContextResource
// No URL -> resolve as resource path.
return getResourceByPath(location);
}
}
}
}
1.3 ProtocolResolver
用户自定义协议资源解决策略:
org.springframework.core.io.ProtocolResolver.
@FunctionalInterface
public interface ProtocolResolver {
// 使用指定的 ResourceLoader ,解析指定的 location 。
@Nullable
Resource resolve(String location, ResourceLoader resourceLoader);
}
最后
以上就是糟糕大叔为你收集整理的Spring源码阅读总结-03-ResourceLoader资源加载器-01的全部内容,希望文章能够帮你解决Spring源码阅读总结-03-ResourceLoader资源加载器-01所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复