后端——框架——容器框架——spring_core——Resource

  Resource的知识点有三个部分,类体系结构,路径字符串与Resource对象的转换, 通配符。

1、类结构

  

   父接口

InputStreamSource:代表输入流,只有一个方法,getInputStream,返回InputStream对象

Resource接口方法

Exists:判断资源文件是否存在,即路径是否指向有效的文件,存在返回true。

isOpen:资源是否处于Open状态,即开始读取资源文件的输入流

getURL:只适用于URLResource,返回url地址

getFile:只适用于FileSystemResource,返回文件的路径,传入的是相对路径返回相对路径,传入绝对路径则返回绝对路径。

createRelative:根据相对路径,转换为Resource对象。

getFilename:返回资源的文件名称

getDescription:返回资源的描述。

实现类

URLResource:代表网络资源,如果字符串中有协议前缀,则字符串会转换为URLResource对象,例如https,http,ftp,file。

ClasspathResource:代表编译路径下面的资源文件。只代表项目的编译路径,不代表其他jar包或者服务器的编译路径,例如Tomcat就有自己的classLoader。

FileSystemResource:代表文件系统中相对路径或绝对路径代表的资源文件。

ServletContextResource:只适用于web项目,代表项目根路径下面的资源文件,一般为WEB-INF/

InputStreamResource:代表输入流,是一种默认值,只有资源文件不属于其他任何一种时,才使用此类。

ByteArrayResource:它底层读取资源文件的输入流类型为ByteArrayInputStream。当读取字节流时使用。

2、 路径转Resource对象

一个资源文件可以根据路径转换为不同的Resource对象。例如磁盘上的文件,既可以表示FileSystemResource,也可以提供file://转换为URLResource。

转换策略如下:

  第一步:首先判定是否存在特殊的前缀,例如classpath:前缀代表ClasspathResource,https:前缀代表URLResource。当没有前缀时,跳转到第二步。

  第二步:由于applicationContext继承了ResourceLoader接口,所以它也是一种资源加载器,根据applicationContext的类型决定。例如ClasspathXmlApplicationContext对应ClasspathResource,FileSystemXmlApplicationContext对应FileSystemResource。

  前缀具有较高优先级,示例中ApplicationContext对象为Classpath,但是由于路径上有前缀file:,所以会转换为URLResource。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file://spring//application.xml");

3、通配符

在资源路径中使用通配符的方式有两种,第一种是classpath*,第二种是路径上的通配符(原著中称为Ant-style)。

第一种是指项目使用组件化或模块化的方式,典型的就是spring框架,分为很多模块。这种情况下classpath*会搜索所有模块的编译路径,classpath只会搜索当前项目的编译路径。

  第二种路径上的通配符,如果是文件夹,使用**表示,如果是文件名,使用*号,例如test/**/application.xml,test/resources/*-context.xml。不论是哪种形式,它第一步都会调用ClassLoader.getResources方法,参数为路径末尾不包含通配符的部分,这会获取一个资源文件列表,然后在根据PathMatcher,这个类会根据路径中其他不包含通配符的部分再次进行过滤,剩余的资源文件列表即为结果。

原文地址:https://www.cnblogs.com/rain144576/p/14758701.html