Spring之ResourceLoader

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种资源:

  1. 文件系统资源
  2. classpath
  3. 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());
    }

Spring之ResourceLoader_第1张图片 

可以看到它是通过getResource的入参location的前缀来判断资源类型的

如果这里你有一些对资源抽象的需求,比如导入一张报表,有可能是OSS下载的也可能是本地上传的。那么可以尝试使用此方法对资源进行抽象统一处理,还是不错的。

到这还没完,哈哈,在DefaultResourceLoader中有这么一个属性和方法

	private final Set protocolResolvers = new LinkedHashSet<>(4);

    /**
	 * Register the given resolver with this resource loader, allowing for
	 * additional protocols to be handled.
	 * 

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等等,再读取时我要先做个校验,那么就可以通过注册我们自己的协议解析器来完成

你可能感兴趣的:(spring,spring,java,后端)