首页 > 代码库 > 资源访问工具类
资源访问工具类
---------------siwuxie095
JDK 所提供的访问资源的类,并不能很好的满足各种底层资源的访问需求,
如:缺少从类路径 或 Web 容器的上下文中获取资源的操作类
因此,Spring 设计了一个 Resource 接口,它为应用提供了更强大的访问
底层资源的能力,该接口拥有对应不同资源类型的实现类
Resource 接口的主要方法:
(1)boolean exists():判断资源是否存在
(2)boolean isOpen():判断资源是否已经打开
(3)URL getURL():如果底层资源可以表示成 URL,则返回对应的 URL 对象
(4)File getFile():如果底层资源对应一个文件,则返回对应的 File 对象
(5)InputStream getInputStream():返回资源对应的输入流
Spring 框架使用 Resource 来装载各种资源,这些资源包括:配置文件
资源、 国际化属性文件资源 …
Resource 接口的具体实现类:
(1)ByteArrayResource
ByteArrayResource,即 二进制数组表示的资源,二进制数组资源
可以在内存中通过程序构造
(2)ClassPathResource
ClassPathResource,即 类路径下的资源,资源以相对于类路径的方式表示
(3)FileSystemResource
FileSystemResource,即 文件系统资源,资源以文件系统路径的方式表示
(4)InputStreamResource
InputStreamResource,即 输入流资源,资源以输入流返回的方式表示
(5)ServletContextResource
ServletContextResource,即 Web 容器上下文中的资源,负责以相对
于 Web 应用根目录的路径来加载资源
支持以 流 和 URL 的方式来进行访问,在 war 包解包的情况下,也可以
通过 File 的方式来进行访问,该类还可以直接从 jar 包中来访问资源
(6)UrlResource
UrlResource 封装了 java.net.URL,它使用户能够访问任何可以通过
URL 表示的资源,如:文件系统资源、HTTP 资源、FTP 资源 …
有了以上几个抽象资源类后,就可以将 Spring 的配置信息放置在任何地方,
如:数据库 或 LDAP,只要最终可以通过 Resource 接口返回配置信息即可
为了访问不同类型的资源,必须使用相应的 Resource 实现类,这是比较麻烦的,
Spring 提供了一个强大的加载资源的机制,不但能够通过 classpath、file 等不同
地址前缀来识别不同的资源类型,而且还支持 Ant 风格的带通配符的资源地址
Spring 支持的不同类型的资源地址前缀:
(1)classpath
从类路径中加载资源,classpath: 与 classpath:/ 等价,都是相对于
类的根路径,而资源文件可以在标准的文件系统中,也可以在 jar 或
zip 格式的类包中
如:classpath:com/siwuxie095/bean.xml
或:classpath:/com/siwuxie095/bean.xml
(2)file
使用 UrlResource 从文件系统目录中装载资源,可采用绝对
或相对路径,file: 与 file:/ 等价
如:file:com/siwuxie095/bean.xml
或:file:/com/siwuxie095/bean.xml
(3)http
使用 UrlResource 从 Web 服务器中装载资源
如:http://www.siwuxie095.com/bean.xml
(4)ftp
使用 UrlResource 从 FTP 服务器中装载资源
如:ftp://www.siwuxie095.com/bean.xml
(5)无前缀
如:com/siwuxie095/bean.xml
根据 ApplicationContext 的具体实现类采用
对应类型的 Resource
其中,有和 classpath: 对应的,还有另外一种
比较难以理解的:classpath*:
假设有多个 jar 包文件 或文件系统类路径都拥有
一个相同的包名,如:com.siwuxie095
二者的区别在于:
classpath: 只会在第一个加载的 com.siwuxie095 包下查找,
而 classpath*: 会扫描所有这些 jar 包以及类路径下出现的
com.siwuxie095 包
这对于分模块打包的应用非常有用,假设一个名为 siwuxie095
的应用共分成 3 个模块
每一个模块都对应一个配置文件,分别是:module1.xml、
module2.xml 和 module3.xml
它们都放到了 com.siwuxie095 目录下,每个模块单独打成 jar 包
当使用 classpath*:com/siwuxie095/module*.xml,可以成功加载
到这三个模块的配置文件
而使用 classpath:com/siwuxie095/module*.xml,只会加载第一个
模块的配置文件
Ant 风格资源地址支持的匹配符:
(1)?:匹配文件名中的一个字符
(2)*:匹配文件名中的任意字符
(3)**:匹配多层路径
Ant 风格的资源路径示例:
(1)classpath:com/t*st.xml
(2)file:D:/conf/*.xml
(3)classpath:com/**/test.xml
(4)classpath:org/springframework/**/*.xml
Spring 定义了一套资源加载的接口,并提供了实现类,如下:
ResourceLoader 接口仅有一个 getResource(String location) 方法,
可以根据一个资源地址加载文件资源,但资源地址仅支持带资源类型
前缀的表达式,而不支持 Ant 风格的资源路径表达式
ResourcePatternResolver 扩展了 ResourceLoader 接口,它定义了
一个新的接口方法:getResources(String locationPattern),该方法
支持带资源类型前缀以及 Ant 风格的资源路径表达式
PathMatchingResourcePatternResolver 是 Spring 提供的
ResourcePatternResolver 接口的标准实现类
PathMatchingResourcePatternResolver 用法如下:
【made by siwuxie095】
资源访问工具类