Spring ClassPathResource加载资源文件详解
先看Demo
@Test public void testClassPathResource() throws IOException { Resource res = new ClassPathResource("resource/ApplicationContext.xml"); InputStream input = res.getInputStream(); Assert.assertNotNull(input); }
再看内部源码
public ClassPathResource(String path) { this(path, (ClassLoader) null); } public ClassPathResource(String path, ClassLoader classLoader) { Assert.notNull(path, "Path must not be null"); String pathToUse = StringUtils.cleanPath(path); if (pathToUse.startsWith("/")) { pathToUse = pathToUse.substring(1); } this.path = pathToUse; this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader()); } public ClassPathResource(String path, Class<?> clazz) { Assert.notNull(path, "Path must not be null"); this.path = StringUtils.cleanPath(path); this.clazz = clazz; }
获取资源内容
/** * This implementation opens an InputStream for the given class path resource. * @see java.lang.ClassLoader#getResourceAsStream(String) * @see java.lang.Class#getResourceAsStream(String) */ @Override public InputStream getInputStream() throws IOException { InputStream is; if (this.clazz != null) { is = this.clazz.getResourceAsStream(this.path); } else if (this.classLoader != null) { is = this.classLoader.getResourceAsStream(this.path); } else { is = ClassLoader.getSystemResourceAsStream(this.path); } if (is == null) { throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist"); } return is; }
源码解读
该类获取资源的方式有两种:Class获取和ClassLoader获取。
@Test public void testResouce() { ClassLoader loader = Thread.currentThread().getContextClassLoader(); System.out.println(loader.getResource("").getPath()); System.out.println(this.getClass().getResource("").getPath()); System.out.println(this.getClass().getResource("/").getPath()); System.out.println(System.getProperty("user.dir")); }
运行结果:
/home/temp/spring_test/target/test-classes/ /home/temp/spring_test/target/test-classes/com/test/spring/spring_test/ /home/temp/spring_test/target/test-classes/ /home/temp/spring_test
//获取的是相对于当前类的相对路径 Class.getResource("") //获取的是classpath的根路径 Class.getResource("/") //获取的是classpath的根路径 ClassLoader.getResource("")
总结
在创建ClassPathResource对象时,我们可以指定是按Class的相对路径获取文件还是按ClassLoader来获取。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2019-07-01 使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空
2019-07-01 CSRF 攻击的应对之道
2016-07-01 DatabaseFactory.CreateDatabase 方法操作数据库