一、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接口其主要实现类有ClassPathResource、FileSystemResource、UrlResource、ByteArrayResource、ServletContextResource和InputStreamResource。Resource接口中主要定义有以下方法:
ClassPathResource可用来获取类路径下的资源文件。假设我们有一个资源文件test.txt在类路径下,我们就可以通过给定对应资源文件在类路径下的路径path来获取它,new ClassPathResource(“test.txt”)。
FileSystemResource可用来获取文件系统里面的资源。我们可以通过对应资源文件的文件路径来构建一个FileSystemResource。FileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。
UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。
ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。ServletContextResource持有一个ServletContext的引用,其底层是通过ServletContext的getResource()方法和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