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());
    }

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值