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实现类,不同的实现类负责不同的资源访问逻辑。

SpringResource设计是一种典型的策略模式,通过使用Resource接口,客户端程序可以在不同的资源访问策略之间自由切换。关于策略模式请参考本书第9章。

Resource不仅可以在Spring的项目中使用,也可以直接作为资源访问的工具类使用。也就是说即使不使用Spring框架,也可以使用Resource来代替Java API中的URL类。当然,使用Resource接口会让代码与Spring的接口耦合在一起,但这种耦合只是部分工具集的耦合,不会造成太大的代码污染。