先看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. sql表别名

    表名.列明后面接as xx,xx就是表/列的别名,as可省略 别名通常有两个作用 as可省略,as可省略

  2. div span

    无牵无挂,不带任何样式,因此经常使用div完成整体样式的构建,span完成细微样式的构建. div为块级元素,span为行内元素. 使用div完成显示区域的居中.左右浮动等,完成整体的样式布局,然后在 ...

  3. sql server 游标 写给自己

    ) --定义两个局部变量 @id @name 全局变量是两个@@name ) Declare Cur Cursor For --定义一个游标 select id,name from temp1 --查 ...

  4. Socket练习

    第一类方法 package socketLianXi; import java.io.IOException; import java.io.InputStreamReader; import jav ...

  5. linux 压缩 解压zip 命令

    将当前目录下的所有文件和文件夹全部压缩成test.zip文件,-r表示递归压缩子目录下所有文件zip -r test.zip ./* 打包目录zip test2.zip test2/*解压test.z ...

  6. SSD Trim Support -- 保护 SSD

    今天同事告诉我,换了 ssd 之后需要做以下配置能使 ssd 寿命更长.原理是配置系统定期清理和回收 ssd 的资源. 最终效果: 步骤: 1.下载 trim enabler: https://gis ...

  7. 用sublime写出的第一个网页

    STEP1 完成语义分析器 我用的vs2013 c语言写的 这个过程会在下一篇文章中详讲 准备好几个编译好的图,放在一个文件夹里,像下面这样 STEP2 规划好html的框架 上代码! (截图版) ( ...

  8. ubuntu下的时间设定(硬件时间,系统时间,本地时间)

    问题的来由是在这里: 在cron里设定任务是在凌晨6点执行,检查日志时发现时间总是不对,是在22点左右的时间执行的.研究发现,任务是在本地时间的6点执行了,但不知为什么syslog中的时间都是为utc ...

  9. dynamoDb 使用

    如果写入时候结构体为: type Item struct {  DeviceId string `dynamo:"deviceid"` Play int `dynamo:" ...

  10. JMeter学习-022-JMeter 分布式测试(性能测试大并发、远程启动解决方案)

    在使用 JMeter 进行性能测试时,难免遇到要求并发请求数比较的场景,此时单台测试机的配置(CPU.内存.带宽等)可能无法支持此性能测试场景.因而,此时 JMeter 提供的分布式测试功能就有了用武 ...