PathMatchingResourcePatternResolver可以用来解析资源文件,主要是用来解析类路径下的资源文件。当然它也可以用来解析其它资源文件,如基于文件系统的本地资源文件。PathMatchingResourcePatternResolver在使用时可以直接new一个对象,new的时候可以通过使用带ResourceLoader参数的构造方法指定需要使用的ResourceLoader,解析好了资源后获取资源时需要通过ResourceLoader获取。PathMatchingResourcePatternResolver其实也是实现了ResourceLoader接口的。空的构造方法将使用DefaultResourceLoader获取资源。大多数时候我们直接使用其空构造函数即可。以下是一些PathMatchingResourcePatternResolver的使用示例。
1.获取文件系统文件
获取文件系统文件时需要指定file前缀或者指定一个文件的绝对地址。如下示例就是取当前用户路径下的pom.xml文件的示例,这里用的是一个相对路径,也可以把它改成一个绝对路径。不加资源协议时会从类路径下去找对应的文件。
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resource = resolver.getResource("file:pom.xml");
Assert.assertNotNull(resource);
Assert.assertNotNull(resource.getInputStream());
2.从类路径下获取指定的文件
以下示例是从类的根路径下获取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");
3.获取所有类路径下的指定文件
可以通过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);
4.使用通配符获取满足某种格式的文件
在解析文件时可以通过*表示匹配所有的字符,比如下面的示例将匹配类的根路径下的所有的以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);
关于PathMatchingResourcePatternResolver的更多介绍也可以参考它的Java doc文档。
(注:本文是基于Spring4.1.0所写,由Elim写于2017年10月9日)
相关推荐
SpringCloud——分布式配置中心(Spring Cloud Config)之高可用的分布式配置中心
SpringCloud——消息总线(Bus)之Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。
SpringCloud——断路器(Hystrix)之Ribbon使用断路器和Feign使用断路器
SpringCloud——分布式跟踪(Sleuth)之Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案。
Spring boot——@DeclareParents例子...
SpringCloud——服务注册(consul)之Consul通过HTTP API和DNS提供服务发现服务。
Spring系列——MVC框架整合.md
SpringCloud——路由器和过滤器(Zuul)之微服务网关的实现
关于Spring方面的常见面试题
MyBatis与Spring整合——通过官方文档进行最简单的整合
Spring总结——田超凡【原创田超凡,已申请版权,禁止随意转发,侵权仿冒必究】
所有Spring——jar详细介绍 所有Spring——jar详细介绍 所有Spring——jar详细介绍
Zookeeper作为注册中心搭建SpringCloud实现服务注册及发现
我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC...【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)
NULL 博文链接:https://ylxy3058.iteye.com/blog/2225314
SpringCloud-Eureka实现服务的注册与发现,创建服务注册中心(eureka-server)和服务提供者 (eureka-client)
SpringCloud —— Eureka 集群 SpringCloud —— 服务注册进 Eureka 集群 SpringCloud —— Eureka 自我保护 SpringCloud —— SpringCloud Consul 实现服务注册中心 SpringCloud —— 三个注册中心的异同点 ...
NULL 博文链接:https://snowolf.iteye.com/blog/236264
NULL 博文链接:https://ylxy3058.iteye.com/blog/2230763