先看Demo:

1 @Test
2 public void testClassPathResource() throws IOException {
3 Resource res = new ClassPathResource("resource/ApplicationContext.xml");
4 InputStream input = res.getInputStream();
5 Assert.assertNotNull(input);
6 }

再看内部源码:

1 public ClassPathResource(String path) {
2 this(path, (ClassLoader) null);
3 }
1 public ClassPathResource(String path, ClassLoader classLoader) {
2 Assert.notNull(path, "Path must not be null");
3 String pathToUse = StringUtils.cleanPath(path);
4 if (pathToUse.startsWith("/")) {
5 pathToUse = pathToUse.substring(1);
6 }
7 this.path = pathToUse;
8 this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader());
9 }
1 public ClassPathResource(String path, Class<?> clazz) {
2 Assert.notNull(path, "Path must not be null");
3 this.path = StringUtils.cleanPath(path);
4 this.clazz = clazz;
5 }

获取资源内容:

 1 /**
2 * This implementation opens an InputStream for the given class path resource.
3 * @see java.lang.ClassLoader#getResourceAsStream(String)
4 * @see java.lang.Class#getResourceAsStream(String)
5 */
6 @Override
7 public InputStream getInputStream() throws IOException {
8 InputStream is;
9 if (this.clazz != null) {
10 is = this.clazz.getResourceAsStream(this.path);
11 }
12 else if (this.classLoader != null) {
13 is = this.classLoader.getResourceAsStream(this.path);
14 }
15 else {
16 is = ClassLoader.getSystemResourceAsStream(this.path);
17 }
18 if (is == null) {
19 throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist");
20 }
21 return is;
22 }

源码解读:

该类获取资源的方式有两种:Class获取ClassLoader获取

两种方法的区别:

再看Demo:

 1 @Test
2 public void testResouce() {
3 ClassLoader loader = Thread.currentThread().getContextClassLoader();
4 System.out.println(loader.getResource("").getPath());
5
6 System.out.println(this.getClass().getResource("").getPath());
7 System.out.println(this.getClass().getResource("/").getPath());
8
9 System.out.println(System.getProperty("user.dir"));
10 }

运行结果:

1
2
3
4
/home/sunny/workspace/spring-01/target/test-classes/
/home/sunny/workspace/spring-01/target/test-classes/com/me/spring/spring_01/
/home/sunny/workspace/spring-01/target/test-classes/
/home/sunny/workspace/spring-01

Class.getResource("")获取的是相对于当前类的相对路径

Class.getResource("/")获取的是classpath的根路径

ClassLoader.getResource("")获取的是classpath的根路径

在创建ClassPathResource对象时,我们可以指定是按Class的相对路径获取文件还是按ClassLoader来获取。

Spring之ClassPathResource加载资源文件的更多相关文章

  1. Spring boot 国际化自动加载资源文件问题

    Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义 ...

  2. spring 如何动态加载properties文件的内容

    1. 在xml中配置你的properties路径: <bean id="messageSource" class="org.springframework.cont ...

  3. Maven,预加载资源文件

    预加载资源文件需要先启用功能: <build> <resources> <resource> <directory>src/main/resources ...

  4. Java加载资源文件的两种方法

    处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...

  5. Spring 启动时加载资源

    Spring加载资源文件目前了解三种, @PostConstruct在Context加载完成之后加载.在创建各个Bean对象之前加载. 实现ApplicationRunner的run方法,Bean加载 ...

  6. 动态加载资源文件(ResourceDictionary)

    原文:动态加载资源文件(ResourceDictionary) 在xaml中控件通过绑定静态资源StaticResource来获取样式Style有多种方式: 1.在项目的启动文件App中<App ...

  7. Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)

    Posted on 2012-03-23 11:21 祥叔 阅读(2886) 评论(6) 编辑 收藏 在Web开发中,我们通过CSS来控制页面元素的样式,一般常用三种方式: 1.       内联样式 ...

  8. PyQt5(5)——加载资源文件

    在实际中我们需要美化界面,就需要许多的自定义图片. 但是我们发现直接导入图像使用,等程序运行时会报错.???? 这就需要建立资源文件并且加载它们,程序就可以顺利运行了. 设计界面是如何加载资源文件呢? ...

  9. spring加载资源文件中classpath*与classpath的区别

    在spring和MyBatis继承的时候,配置mapperLocations.一开始配置是这样的. 需要加载路径为com/thomas/base/mapper和com/thomas/bu/mapper ...

随机推荐

  1. CSS 学习笔记

    0.CSS概念层叠样式表(Cascading Style Sheets),CSS的来历就不必多说了.可以简单的理解为万维网联盟(w3c)为了丰富HTML页面的布局和外观而指定的一种标准. 1.CSS实 ...

  2. Sublime Text 3 杂记

    Sublime Text 是一个功能强大的代码编辑器(收费,但可无限期试用).由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具有丰富扩展功能的Vim.Sublime T ...

  3. 被swoole坑哭的PHP程序员

    被swoole坑哭的PHP程序员 2015-09-16 09:57 文帅营 博客园 字号:T | T 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强 ...

  4. Centos防火墙禁止ping和开启ping

    1.允许PING设置 iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp - ...

  5. PostgreSQL JSON函数

    https://www.postgresql.org/docs/9.6/static/functions-json.html PostgreSQL 9.6.1 Documentation Prev U ...

  6. jquery中css获取颜色属性

    Jquery获取颜色的方法为: var color = $(元素).css("color"); alert(color); 可以看到color如这样的格式; 但是; 因为rgb(0 ...

  7. jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据

    jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...

  8. Java多线程代码示例

    package algorithm; class Mythread extends Thread{ String name; public Mythread(String name){ this.na ...

  9. MWeb 1.7.1 版发布!支持导出为 RTF 和 Docx、发布到 Evernote 带样式、文档库备份和新网站主题等大量改进!

    编辑器及发布服务改进 增加设置图片宽度和居左.居右.居中的语法. 如:![图片说明-w450](pic.jpg) 这样表示设置图片宽度为 450.其中 -w450 为设置语法,生成 HTML 时会自动 ...

  10. XPath 简介

    XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. 在学习之前应该具备的知识: 在您继续学习之前,应该对下面的知识有基本的了解: HTML ...