Spring作为java开发首选的框架,功能真的是非常之多,开个新系列来挨个看看这些功能
今天主要来看看ResourceLoader,顾名思义是做资源加载用的
package org.springframework.core.io;
import org.springframework.lang.Nullable;
import org.springframework.util.ResourceUtils;
public interface ResourceLoader {
/** 加载classpath资源时的伪前缀classpath: */
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
/**
* 获取资源
*/
Resource getResource(String location);
/**
* 获取类加载器
*/
@Nullable
ClassLoader getClassLoader();
}
位于springframework.core.io包下。说明这是一个io操作相关的接口
他有一个默认实现DefaultResourceLoader,通过这个类javadoc得知DefaultResourceLoader可以加载3种资源:
- 文件系统资源
- classpath
- URI网络资源
一个简单的demo
public static void main(String[] args) {
ResourceLoader resourceLoader = new DefaultResourceLoader();
final String location = "/Users/xxxxxx.json";
final Resource fileResource = resourceLoader.getResource("file:" + location);
System.out.println("资源是否存在:" + fileResource.exists());
//resourceLoader操作文件等同于下面的file操作。resourceLoader会将location截取出争取的path然后给到File对象
File file = new File(location);
System.out.println("资源是否存在:" + file.exists());
final Resource uriResource = resourceLoader.getResource("http://pubimage.360doc.com/NewArticle/gzh3.jpg");
System.out.println("资源是否存在:" + uriResource.exists());
final Resource classPathResource = resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "bootstrap.yml");
System.out.println("资源是否存在:" + classPathResource.exists());
}
可以看到它是通过getResource的入参location的前缀来判断资源类型的
如果这里你有一些对资源抽象的需求,比如导入一张报表,有可能是OSS下载的也可能是本地上传的。那么可以尝试使用此方法对资源进行抽象统一处理,还是不错的。
到这还没完,哈哈,在DefaultResourceLoader中有这么一个属性和方法
private final Set<ProtocolResolver> protocolResolvers = new LinkedHashSet<>(4);
/**
* Register the given resolver with this resource loader, allowing for
* additional protocols to be handled.
* <p>Any such resolver will be invoked ahead of this loader's standard
* resolution rules. It may therefore also override any default rules.
* @since 4.3
* @see #getProtocolResolvers()
*/
public void addProtocolResolver(ProtocolResolver resolver) {
Assert.notNull(resolver, "ProtocolResolver must not be null");
this.protocolResolvers.add(resolver);
}
ProtocolResolver协议解析器接口,我们可以通过自定义协议解析器,然后注册到addProtocolResolver注册,那么就可以实现自定义的协议解析了。并且优先级高于默认提供的,所以可以用来覆盖默认行为。这个就很6啦,比如我需要读取多种文件类型,json、yml、xml等等,再读取时我要先做个校验,那么就可以通过注册我们自己的协议解析器来完成