第二章节介绍资源,知识点大致可以分为三个部分。
- 第一部分介绍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,这个类会根据路径中其他不包含通配符的部分再次进行过滤,剩余的资源文件列表即为结果。