在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,而且使我们系统更加简洁,都是对不同的底层资源使用同一个接口进行访问。
spring 提供一个Resource接口来统一这些底层资源一致的访问,而且提供了一些便利的接口,从而能提供我们的生产力。
getInputStream:每次调用都将返回一个新鲜的资源对应的Java.io. InputStream字节流,调用者在使用完毕后必须关闭该资源。
Resource接口继承InputStreamSource接口,并提供一些便利方法:
getURL:如果当前Resource代表的底层资源能由java.util.URL代表,则返回该URL,否则抛出IOException。
getURI:如果当前Resource代表的底层资源能由java.util.URI代表,则返回该URI,否则抛出IOException。
getFile:如果当前Resource代表的底层资源能由java.io.File代表,则返回该File,否则抛出IOException。
contentLength:返回当前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接口提供了足够的抽象,足够满足我们日常使用。而且提供了很多内置Resource实现:ByteArrayResource、InputStreamResource 、FileSystemResource 、UrlResource 、ClassPathResource、ServletContextResource、VfsResource等
具体的实现就自己看代码了
目录`Resource`内置`Resource`实现`UrlResource``ClassPathResource``FileSystemResource``ServletContextResource``ResourceLoader``ResourcePatternResolver``ResourceLoaderAware`
资源
作为依赖应用程序上下文和
资源
路径构建应用程序上下文应用程序上下文构造函数
资源
路径中的通配符Ant 风格`classpath*:`前缀
本章介绍
Spring
如何
处理
资源
以及如何在
面试的时候,你肯定被问过,
Spring
的初始化过程、或者Bean的生命周。我相信大部分人都是死记硬背的,真正能自己读懂代码而说出整个过程的人寥寥无几。
造成这种局面的原因,尝试阅读
Spring
源码的人肯定深有感触,代码量是一部分原因,还有就是里面的各种抽象的接口,如果没有人或者书的指点,你很难知道它是起什么作用。
不是我们的能力不行,而是方法不对。
就像我们工作中,对于别人写的代码让你直接去阅读,没有当事人的帮助,那绝对是很痛苦的一件事,不论你的技术有多牛。
如下图所示,
Java 中有各种各样的
资源
,
资源
的位置包括本地文件系统、网络、类路径等,
资源
的形式可以包括文件、二进制流、字节流等,针对不同的
资源
又有不同的加载形式。本地文件系统中的文件在 Java 中使用 File 表示,使用 FileInputStream 读取。网络上的
资源
使用 URL 表示,使用 URLConnection 获取 InputStream 进行读取。而类路径下的
资源
使用 ClassLoader 进行读取。为了使用统一的方式访问
资源
,
Spring
将
资源
抽象为 Resource,将
资源
的加载抽象为
一、
Spring
的
资源
详解1.1引言在日常程序开发中,
处理
外部
资源
是很繁琐的事情,我们可能需要
处理
URL
资源
、File
资源
、ClassPath相关
资源
、服务器相关
资源
等等很多
资源
。因此
处理
这些
资源
需要使用不同的接口,这就增加了我们系统的复杂性;而且
处理
这些
资源
步骤都是类似的(打开
资源
、读取
资源
、关闭
资源
),因此如果能抽象出一个统一的接口来对这些底层
资源
进行统一访问,是不是很方便,而且使我们系统更加简
文件
资源
操作
Spring
中定义了一个Org.
Spring
Framework.Core.Io.Resource接口,Resource接口是为了加载不同类型的
资源
文件。
1.通过FileSystemResource加载系统绝对文件路径进行访问。
2.通过ClassPathResource加载类文件的方式进行访问。
package com.baobaotao.io;