资源访问工具类

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

   

使用 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】

原文地址:https://www.cnblogs.com/siwuxie095/p/6741632.html