PathMatchingResourcePatternResolver Spring

PathMatchingResourcePatternResolver

  PathMatchingResourcePatternResolver可以用来解析资源文件,主要是用来解析类路径下的资源文件。当然它也可以用来解析其它资源文件,如基于文件系统的本地资源文件。PathMatchingResourcePatternResolver在使用时,可以直接new一个对象,new的时候可以通过使用带ResourceLoader参数的构造方法,指定需要使用的ResourceLoader,解析好了资源后获取资源时需要通过ResourceLoader获取。PathMatchingResourcePatternResolver其实也是实现了ResourceLoader接口的。空的构造方法,将使用DefaultResourceLoader获取资源。大多数时候我们直接使用其空构造函数即可。以下是一些PathMatchingResourcePatternResolver的使用示例。

PathMatchingResourcePatternResolver 是一个Ant模式通配符的Resource查找器,可以用来查找类路径下或者文件系统中的资源

获取文件系统文件

  获取文件系统文件时,需要指定file前缀或者指定一个文件的绝对地址。如下示例就是取当前用户路径下的pom.xml文件的示例,这里用的是一个相对路径,也可以把它改成一个绝对路径。不加资源协议时,会从类路径下去找对应的文件。

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resource = resolver.getResource("file:pom.xml");
Assert.assertNotNull(resource);
Assert.assertNotNull(resource.getInputStream());

从类路径下获取指定的文件

  从类的根路径下获取applicationContext.xml文件

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//从classpath下获取单个的资源文件,classpath下没有将尝试把资源当做一个UrlResource
Resource resource = resolver.getResource("applicationContext.xml");
Assert.assertNotNull(resource);
Assert.assertNotNull(resource.getInputStream());

  如果不是根路径,需要指定路径,比如下面就是从类路径的META-INF/spring目录下获取applicationContext.xml文件。

Resource resource = resolver.getResource("META-INF/spring/applicationContext.xml");

  可以明确的指定classpath前缀

Resource resource = resolver.getResource("classpath:META-INF/spring/applicationContext.xml");

获取所有类路径下的指定文件
  可以通过classpath*前缀指定,从所有的类路径下获取指定的文件,与classpath前缀的区别是classpath前缀只能获取当前类路径下的资源文件,而classpath*前缀可以获取所有类路径下的资源文件,包括jar包中的。以下示例就是从所有类路径下获取META-INF/spring目录下的applicationContext.xml文件。

Resource[] resources = resolver.getResources("classpath*:META-INF/spring/applicationContext.xml");
Assert.assertNotNull(resources);
Assert.assertTrue(resources.length == 1);

使用通配符获取满足某种格式的文件

  在解析文件时可以通过*表示匹配所有的字符,比如下面的示例将匹配类的根路径下的所有的以applicationContext开头的xml文件。

Resource[] resources = resolver.getResources("classpath*:applicationContext*.xml");
Assert.assertNotNull(resources);
//笔者的classpath下一共有三个满足applicationContext*.xml的资源文件
Assert.assertTrue(resources.length == 3);

如果不是在根路径下,也可以指定路径。

Resource[] resources = resolver.getResources("classpath*:com/elim/learn/spring/applicationContext*.xml");
Assert.assertNotNull(resources);
//笔者的classpath下一共有三个满足applicationContext*.xml的资源文件
Assert.assertTrue(resources.length == 3);

假设我们的资源文件是按照模块划分的,放在不同的目录下面,比如com.elim.learn.spring路径下有,com.elim2.learn.spring路径下也有,那么我们可以把elim和elim2用*代替。

Resource[] resources = resolver.getResources("classpath*:com/*/learn/spring/applicationContext*.xml");
Assert.assertNotNull(resources);
//com.elim.learn.spring和com.elim2.learn.spring下各有三个applicationContext*.xml形式的资源文件
Assert.assertTrue(resources.length == 6);

也可以用两个*表示任意多层的目录

Resource[] resources = resolver.getResources("classpath*:com/**/spring/applicationContext*.xml");
Assert.assertNotNull(resources);
//com.elim.learn.spring和com.elim2.learn.spring下各有三个applicationContext*.xml形式的资源文件
Assert.assertTrue(resources.length == 6);

显示所有满足条件资源

ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();

//classpath: 表示加载当前类路径中所有匹配的资源
Resource[] resources = resourcePatternResolver.getResources("classpath:spring/*.xml");
for(Resource r : resources){
    System.out.println(r.getFilename()); //文件名
    System.out.println(r.getURL().getPath()); //文件绝对路径
    System.out.println(r.getFile()); //File对象
    System.out.println(r.getInputStream()); //InputStream对象
}
 
//classpath*: 表示加载类路径中所有匹配的资源
resources = resourcePatternResolver.getResources("classpath*:com/cjm/**/*.class");
for(Resource r : resources){
    System.out.println(r.getURL().getPath()); //文件绝对路径
}
 
//加载文件系统中的资源
Resource r = resourcePatternResolver.getResource("file:c:/dd.properties");
System.out.println(org.apache.commons.io.IOUtils.toString(r.getInputStream())); //读取文件内容


参考:
原文:https://blog.csdn.net/elim168/article/details/78197596

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值