Spring-Resource与ResourceLoader接口

一、Resource接口

Spring中有很多xml配置文件,同时还有自定义的各种properties资源文件,还有可能进行网络交互,收发各种文件、二进制流等。在Spring内部,针对于资源文件有一个统一的接口Resource表示,

Resource接口的方法: 
● exists:返回Resource所指向的底层资源是否存在 
● isReadable:返回当前Resource代表的底层资源是否可读 
● isOpen:返回Resource资源文件是否已经打开,如果返回true,则只能被读取一次然后关闭以避免内存泄漏;常见的Resource实现一般返回false 
● getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IO异常 
● getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IO异常 
● getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IO异常 
● contentLength:返回当前Resource代表的底层文件资源的长度,一般是值代表的文件资源的长度。 
● lastModified:返回当前Resource代表的底层资源的最后修改时间。 
● createRelative:用于创建相对于当前Resource代表的底层资源的资源,比如当前Resource代表文件资源“d:/test/”则createRelative(“test.txt”)将返回表文件资源“d:/test/test.txt”Resource资源。 
● getFilename:返回当前Resource代表的底层文件资源的文件路径,比如File资源“file://d:/test.txt”将返回“d:/test.txt”,而URL资源http://www.javass.cn将返回“”,因为只返回文件路径。 
● getDescription:返回当前Resource代表的底层资源的描述符,通常就是资源的全路径(实际文件名或实际URL地址)。

 

Resource接口其主要实现类有ClassPathResourceFileSystemResourceUrlResourceByteArrayResourceServletContextResourceInputStreamResourceResource接口中主要定义有以下方法:

ClassPathResource可用来获取类路径下的资源文件。假设我们有一个资源文件test.txt在类路径下,我们就可以通过给定对应资源文件在类路径下的路径path来获取它,new ClassPathResource(“test.txt”)

FileSystemResource可用来获取文件系统里面的资源。我们可以通过对应资源文件的文件路径来构建一个FileSystemResourceFileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。

UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource

ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。

ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。ServletContextResource持有一个ServletContext的引用,其底层是通过ServletContextgetResource()方法和getResourceAsStream()方法来获取资源的。

 InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。

 二、ResourceLoader接口

在Spring里面还定义有一个ResourceLoader接口,该接口中只定义了一个用于获取Resource的getResource(String location)方法。在Spring中所有的ApplicationContext都实现了ResourceLoader接口。

public interface ResourceLoader {
    String CLASSPATH_URL_PREFIX = "classpath:";

    Resource getResource(String var1);

    ClassLoader getClassLoader();
}

通过ResourceLoader接口获取Resource对象的示例:

Resource resource = resourceLoader.getResource("file:E:\\work\\spring-test01\\src\\main\\resources\\application.properties");

Resource resource = applicationContext.getResource("classpath:/application.properties");

Resource resource = applicationContext.getResource("application.properties");

上面三个例子中:第三个文件路径没有任何前缀(“file”前缀代表文件系统,“classpath”前缀代表类文件夹),这种时候以applicationContext的配置文件的加载路径为相对路径。

三、通过ApplicationContext演示ResourceLoader接口

定义类型,同时实现ApplicationContextAware接口,在初始化时获取ApplicationContext对象:

package com.bxp.resource;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.Resource;

import java.io.IOException;

public class MyResourceLoader implements ApplicationContextAware {
    private ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void resource() throws IOException {
        // Resource resource = applicationContext.getResource("file:E:\\work\\spring-test01\\src\\main\\resources\\application.properties");
        Resource resource = applicationContext.getResource("application.properties");
        System.out.println("文件的名称是:" + resource.getFilename());
        System.out.println("文件的大小是:" + resource.contentLength());
    }
}

 配置类的bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

   
    <bean id = "myResourceLoader" class = "com.bxp.resource.MyResourceLoader" ></bean>

</beans>

测试:

    @Test
    public void test() throws IOException {
        MyResourceLoader myResourceLoader = super.getBean("myResourceLoader");
        myResourceLoader.resource();
        //System.out.println("Test:" + super.getBean("myBeanName"));
    }

输出内容:
文件的名称是:application.properties
文件的大小是:0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值