Spring中的Resource接口

Spring中的Resource接口

     spring中的org.springframework.core.io.Resource接口代表着物理存在的任何资源,其继承于org.springframework.core.io.InputStreamSource;其子类有如下几种:ByteArrayResource, ClassPathResource, DescriptiveResource, FileSystemResource, InputStreamResource, PortletContextResource, ServletContextResource, UrlResource 。常用的有以下四种:

  1. ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;
  2. FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问;
  3. ServletContextResource:通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。
  4. UrlResource :通过java.net.URL来访问资源,当然它也支持File格式,如“file:”

 先看一下Resource接口的定义:

public interface Resource extends InputStreamSource {
    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;
                     
    Resource createRelative(String relativePath) throws IOException;   //根据相对路径创建资源

    String getFilename();

    String getDescription();
}

它提供我们访问资源最基本的接口。我们实际访问的时候直接用Resource接口就可以,不比使用其子类。在初始化时,其子类的实现各有不同。

首先看最常用的ClassPathResource :

public InputStream getInputStream() throws IOException {
    InputStream is = null;
    if (this.clazz != null) {
        is = this.clazz.getResourceAsStream(this.path);
    }
    else {
        is = this.classLoader.getResourceAsStream(this.path);
    }
    if (is == null) {
        throw new FileNotFoundException(
                getDescription() + " cannot be opened because it does not exist");
    }
    return is;
}
 这个是ClassPathResource 获得InputStream的代码,可以看出,它是通过Class或者ClassLoader的getResourceAsStream()方法来获得InputStream的。关于这两个类的方法的区别我另外的一篇文章已经解释。其path一般都是以“classpath:”开头,如果以“classpath*:”开头表示所有与给定名称匹配的classpath资源都应该被获取。

其次来看FileSystemResource:

public FileSystemResource(String path) {
    Assert.notNull(path, "Path must not be null");
    this.file = new File(path);
    this.path = StringUtils.cleanPath(path);
}    
public InputStream getInputStream() throws IOException {
    return new FileInputStream(this.file);
}

就是根据给定的Path来构造File,然后再构造FileInputStream。这儿的path一般要给出绝对路径,当然也可以是相对路径,但是如果使用相对路径要注意其根目录。例如在eclipse中,它的根目录就是你工程目录作为你的根目录。

再来看ServletContextResource:

public InputStream getInputStream() throws IOException {
    InputStream is = this.servletContext.getResourceAsStream(this.path);
    if (is == null) {
        throw new FileNotFoundException("Could not open " + getDescription());
    }
    return is;
}

ServletContextResource通过ServletContext的getResourceAsStream()来取得InputStream,这里path必须以“/”开头,并且相对于当前上下文的根目录。如常用path="/WEB-INF/web.xml"。

最后来看UrlResource:

public UrlResource(String path) throws MalformedURLException {
    Assert.notNull(path, "Path must not be null");
    this.url = new URL(path);
    this.cleanedUrl = getCleanedUrl(this.url, path);
}
public InputStream getInputStream() throws IOException {
    URLConnection con = this.url.openConnection();
    con.setUseCaches(false);
    return con.getInputStream();
}

UrlResource 封装了 Java.net.URL,它能够被用来访问任何通过URL可以获得的对象,例如:文件、HTTP对象、FTP对象等。所有的URL都有个标准的 String表示,这些标准前缀可以标识不同的URL类型,包括file:访问文件系统路径,http: 通过HTTP协议访问的资源,ftp: 通过FTP访问的资源等等。

在Spring配置文件中,我们只需要给出字符串类型的path即可,Spring会通过ResourceEditor(java.beans.PropertyEditor的子类)和ResourceLoader把给定的path转换为相应的Resource。转换规则如下:

前缀例子说明

classpath:

classpath:com/myapp/config.xml

从classpath中加载。

file:

file:/data/config.xml

作为 URL 从文件系统中加载。

http:

http://myserver/logo.png

作为 URL 加载。

(none)

/data/config.xml

根据 ApplicationContext 进行判断。

摘自于Spring Framework参考手册

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值