8.3 资源访问
8.3 资源访问
正如前面看到的,创建Spring
容器时通常需要访问XML
配置文件。除此之外,程序可能有大量地方需要访问各种类型的文件、二进制流等。
什么是资源
Spring
把这些文件
、二进制流
等统称为资源
。
Java API提供的资源访问类
在官方提供的标准API
里,资源访问通常由java.net.URL
和文件IO
来完成,如果需要访问来自网络的资源,则通常会选择URL
类。URL
类可以处理一些常规的资源访问问题,但依然不能很好地满足所有底层资源访问的需要,比如,暂时还无法在类加载路径
或相对于 ServletContext
的路径中访问资源。虽然Java
允许使用特定的URL
前缀注册新的处理类(例如已有的http:
前缀的处理类),但是这样做通常比较复杂,而且URL
接口还缺少一些有用的功能,比如检查所指向的资源是否存在等。
Spring提供Resource接口来访问资源
Spring
改进了Java
资源访问的策略, Spring
为资源访问提供了一个Resource
接口,该接口提供了更强的资源访问能力, Spring
框架本身大量使用了Resource
来访问底层资源。
Resource接口
Resource
本身是一个接口,是具体资源访问策略的抽象,也是所有资源访问类要实现的接口Resource
接口主要提供如下几个方法。
方法 | 描述 |
---|---|
getlnputStream() |
定位并打开资源,返回资源对应的输入流。每次调用都返回新的输入流。调用者必须负责关闭输入流 |
exists() |
判断Resource 所指向的资源是否存在。 |
isOpen() |
判断资源文件是否打开,如果资源文件不能多次读取,每次读取结束时应该显式关闭,以防止资源泄漏。 |
getDescription() |
返回资源的描述信息,用于资源处理出错时输出该信息,通常是全限定文件名或实际URL 。 |
getFile() |
返回资源对应的File 对象。 |
getURL() |
返回资源对应的URL 对象。 |
最后的getFile()
和getURL()
这两个方法通常无须使用,仅在通过简单方式访问无法实现时, Resource
才提供传统的资源访问功能。
Resource
接口本身没有提供访问任何底层资源的实现逻辑,针对不同的底层资源, Spring
将会提供不同的Resource
实现类,不同的实现类负责不同的资源访问逻辑。
Spring
的Resource
设计是一种典型的策略模式,通过使用Resource
接口,客户端程序可以在不同的资源访问策略之间自由切换。关于策略模式请参考本书第9章。
Resource
不仅可以在Spring
的项目中使用,也可以直接作为资源访问的工具类使用。也就是说即使不使用Spring
框架,也可以使用Resource
来代替Java API
中的URL
类。当然,使用Resource
接口会让代码与Spring
的接口耦合在一起,但这种耦合只是部分工具集的耦合,不会造成太大的代码污染。