Resource与ResourceLoader
1.什么是Resource(资源)
Resource是一个广泛的概念,凡是可以通过IO进行读取的,都可以称为一个Resource,包括众多的类型的Resource,下面是一些常见的Resource的概念:
- 物理磁盘上存在的真实的文件,比如test.txt;
- ClassPath下Jar包内部的一个文件,比如META-INF/spring.factories;
- 远程服务器上的资源,可以通过URL定位到对应的资源的位置;
- …
我们可以将Resource称为一个广义上的文件,只不过这个文件可能是来自各个地方,比如来自于本地文件,也可能来自于远程的文件。
既然资源可以理解成为一个广义上的文件,参考Java当中对于文件(File)的API设计,我们可以知道资源会存在如下这些特性?
- 资源是否存在?
- 资源是否可读?
- 资源是否可写?
- 资源的URL/URI地址?
- 资源的文件名称?
- 资源的大小(长度)?
- 资源的最后一次修改时间
这些特性,对应的也就是SpringCore当中对于Resource这个接口的底层API设计。
public interface Resource extends InputStreamSource {
boolean exists();
default boolean isReadable() {
return exists();
}
default boolean isOpen() {
return false;
}
default boolean isFile() {
return false;
}
URL getURL() throws IOException;
URI getURI() throws IOException;
File getFile() throws IOException;
default ReadableByteChannel readableChannel() throws IOException {
return Channels.newChannel(getInputStream());
}
long contentLength() throws IOException;
long lastModified() throws IOException;
Resource createRelative(String relativePath) throws IOException;
String getFilename();
String getDescription();
}
我们开发过程当中平时用的最多的Resource主要是以下两类:本地文件的Resource和ClassPath下Jar包当中内部嵌套的Resource。
1.2 什么是ResourceLoader
既然存在有Resource,那么必然需要存在有资源的加载的加载器,需要通过加载器才能帮你找到对应的Resource。
Spring当中的ResourceLoader的主要作用,就是进行Resource的加载。