PathMatchingResourcePatternResolver
PathMatchingResourcePatternResolver可以用来解析资源文件,主要是用来解析类路径下的资源文件。当然它也可以用来解析其它资源文件,如基于文件系统的本地资源文件。PathMatchingResourcePatternResolver在使用时,可以直接new一个对象,new的时候可以通过使用带ResourceLoader参数的构造方法,指定需要使用的ResourceLoader,解析好了资源后获取资源时需要通过ResourceLoader获取。PathMatchingResourcePatternResolver其实也是实现了ResourceLoader接口的。空的构造方法,将使用DefaultResourceLoader获取资源。大多数时候我们直接使用其空构造函数即可。以下是一些PathMatchingResourcePatternResolver的使用示例。
获取文件系统文件
获取文件系统文件时,需要指定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);
参考:
原文:https://blog.csdn.net/elim168/article/details/78197596
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现