什么是Spring 中的“资源”,如何查找这些“资源”

152 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

这篇文章我们来介绍Spring 中的“资源”,以及如何加查找这些系统中的“资源”。

Spring 中的资源(Resource)

Resource 接口作为系统中所有资源的抽象。

在Spring 框架内部,是使用org.springframework.core.io.Resource 接口当做所有资源和抽象访问的接口的。

Resource 接口会根据不同类型的资源或者不同场合的资源给出相应的具体的实现。Spring 在这个理念之上,给出了一系列的具体的实现类。如:ByteArrayResource / ClassPathResource / FileSystemResource / UrlResource / InputStreamResource。

如果Spring 给的具体实现类不满足要求,那么我们可以自定义自己的实现类,只要实现Resource 接口即可。在实际开发的时候,我们倒不必真正去实现Resource 接口,我们只需要继承org.springframework.core.io.AbstractResource 抽象类即可。但是实际上却几乎碰不到要定制化开发的事情,我们只需要知道有这种功能即可。

Spring 中的ResourceLoader

在前文中我们大概解释了一下URL。

在Spring 中,我们使用Resource 来抽象所有的资源,但是有了这些资源之后,我们下一步就该考虑,怎样能查找到这些资源呢?怎样对这些资源进行定位呢?怎样把这些资源加载到系统中呢?

这就是ResourceLoader 的工作了。ResourceLoader 的意思就是“资源填装器。

对应于抽象资源的接口Resource,资源查找和定位策略的抽象接口就是ResourceLoader。(这样对比记忆一定会好一些)

而具体的资源查找和定位策略则是由ResourceLoader 的具体的实现给出的。对比与上面的URL 类来看,我们可以把ResourceLoader 理解为“统一的资源查找定位器”。

我们来看一下ResourceLoader 接口的定义:

public interface ResourceLoader {
   String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
   Resource getResource(String location);
   ClassLoader getClassLoader();
}

其中,getResource 方法的作用就是用来根据指定资源的位置去定位到具体资源。

在Spring 框架中,有几个ResourceLoader 可用,如:DefaultResourceLoader / FileSystemResourceLoader。

另外,Spring 还提供了一个批量查找ResourceLoader 的扩展,ResourcePatternLoader。