对于JAVA来说,资源访问通常有java,net.URL和文件IO流来完成,如果需要访问来自网络的资源时,通常选择URL类,可是URL类目前还无法在类加载路径或者相对于ServletContext的路径中访问资源。虽然可以使用特定的URL前缀注册新的处理类,但是这样做通常比较复杂,而且URL接口还缺少一些有用的功能,比如检查所指向的资源是否存在等。
Spring提供了一个Resource接口,该接口是所有资源访问类所实现的接口,该接口主要提供了如下几个方法:
getInputStream():定位并且打开资源,返回资源对应的输入流,每次调用都会返回新的输入流,调用者必须负责关闭输入流
isOpen():返回资源文件是否打开,如果资源文件不能多次读取,每次读取结束时应该显示关闭,以防止资源泄露
exists():返回Resource所指向的资源是否存在
getDescription():返回资源的描述信息,用于资源处理出错时输出该信息,通常是全限定文件名或者实际URL
getFile():返回资源对应的File对象
getURL():返回资源对应的URL对象
Resource接口是Spring资源访问的接口,具体的资源访问由该接口的实现类完成。Spring提供了Resource接口的大量实现类:
UrlReource:访问网络资源的实现类
ClassPathResource:访问类加载路径里资源的实现类
FileSystemResource: 访问文件系统里的资源的实现类
ServletContextResource:访问相对于ServletContext路径下的资源的实现类,通常在WEB应用中使用
InputStreamResource:访问输入流资源的实现类
ByteArrayResource:访问字节数组资源的实现类
Spring提供如下两个标识性接口:
1>ResourceLoader:该接口实现类的实例可以获得一个Resource实例,该接口里有如下方法: Resource getResource(String location):该接口仅包含这个方法,该方法用于返回一个Resource实例。ApplicationContext的实现类都实现了ResourceLoader接口,因此ApplicationContext直接获取Resource实例
2>ResourceLoaderAware:该接口实现类的实例将获得一个ResourceLoader的引用。该接口包含一个方法:void setResourceLoader(ResourceLoader resourceLoader);该方法用于设置一个ResourceLoader实例。实现该接口的类之后,可以配置成Bean实例,我们不需要为该setter方法显式<property />设置参数传递,Spring容器会自动检测到实现ResourceLoaderAware接口的Bean类然后自动将自动传递给该参数作为ResourceLoader引用。
使用ResourceLoaderAware接口示例:
public class Simple implements ResourceLoaderAware {
private ResourceLoader resourceloader ;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader ;
}
public ResourceLoader getResourceLoader() {
return resourceLoader ;
}
}
//配置Spring.xml
<beans ...>
<bean id="simple" class="Simple" />
</beans>
//测试主程序
public class test {
public static void main(String[] args) {
ApplicationContext act = new ClassPathXmlApplicationContext("Spring.xml") ;
Simple simple = acr.getBean("simple",Simple.class) ;
//检测Spring容器是否自动传入ResourceLoader属性值
ResourceLoader rl = simple.getReourceLoader() ;
//控制台输出:true
System.out.println("Spring容器是否将自身传入成ResourceLoader值?: + (rl == act)) ;
}
}