资源访问工具类

来源:互联网 发布:西宁数据工程师招聘 编辑:程序博客网 时间:2024/06/09 21:33

---------------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

  

  

2file

  

使用UrlResource从文件系统目录中装载资源,可采用绝对

或相对路径,file:file:/ 等价

  

  

如:file:com/siwuxie095/bean.xml

或:file:/com/siwuxie095/bean.xml

  

3)http

  

使用UrlResourceWeb服务器中装载资源

  

如:http://www.siwuxie095.com/bean.xml

  

  

4)ftp

  

使用UrlResourceFTP服务器中装载资源

  

如: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风格的资源路径表达式

  

PathMatchingResourcePatternResolverSpring提供的

ResourcePatternResolver接口的标准实现类

  

PathMatchingResourcePatternResolver用法如下:

  

  

  

  

  

  

  

【made by siwuxie095】

0 0
原创粉丝点击