我是靠谱客的博主 糟糕大叔,最近开发中收集的这篇文章主要介绍Spring源码阅读总结-03-ResourceLoader资源加载器-01,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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.DefaultResourceLoaderResourceLoader 的默认实现。

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部