文章内容来自本人学习《精通Spring 4.x 企业应用开发实战》一书的笔记整理,部分内容摘抄原文。
为了访问不同类型的资源,需要使用不同的Resource实现类,比较麻烦,可以在不显式使用具体Resource实现类的情况下,通过资源地址的特殊标识(如“classpath:”、“file:”)就可以访问到资源。
资源地址表达式
地址前缀: classpath:
示例:classpath:com/hqq/bean.xml
对应的资源类型:从类路径中加载资源,可以在文件系统 中,也 可以在JAR或ZIP的类包中。
地址前缀:file:
示例:file:/com/hqq/bean.xml
对应的资源类型:使用UrlResource从文件系统中加载资源,可采用绝对或相对路径。
地址前缀:http://
示例:http://www.hqq.com/bean.xml
对应的资源类型:使用UrlResource从web服务器中加载资源。
地址前缀:ftp://
示例:file://www.hqq.com/bean.xml
对应的资源类型:使用UrlResource从FTP服务器中加载资源。
地址前缀:没有前缀
示例:com/hqq/bean.xml
对应的资源类型:根据ApplicationContext的具体实现采用对应类型的Resource来加载
“classpath:”与“classpath*:”的区别:
如果有多个JAR包或文件系统类路径都有相同的包名(如 com.hqq),“classpath:”只会在第一个加载的com.hqq包的类路径下查找资源。而“classpath*:”会扫描所有这些JAR包及类路径下出现的com.hqq类路径。
Ant风格的资源地址支持3种匹配符:
-
?:匹配文件名中一个字符。如 classpath:com/h?q/bean.xml
-
*:匹配文件名中的任意字符。如 classpath:com/hqq/*.xml
-
**:匹配多层路径。如 classpath:com/*/.xml
资源加载器
imageResourceLoad接口仅有一个getResource(String location)方法,可以根据一个资源地址加载文件资源,只支持带资源类型前缀的表达式,不支持Ant风格的资源表达式。ResourcePatternResolver接口扩展了ResourceLoader接口,支持Ant风格表达式。PathMatchingResourcePatternResolver是spring提供的标准实现类。
资源加载DEMO
package com.hqq.spring.resourceload;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.IOException;
/**
* 测试spring资源加载DEMO
* Created by HUANGQIQIN on 2018/9/15.
*/
public class TestSpringResourceLoad {
public static void main(String[] args) {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
//加载所有类包com.hqq下的xml文件
Resource[] resources = resolver.getResources("classpath*:com/hqq/**/*.xml");
for (Resource resource : resources){
System.out.println(resource.getDescription());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
file [F:\ideawork\hqqstudy\springstudy\target\classes\com\hqq\spring\resourceload\application-spring.xml]
网友评论