先看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. Rails--n+1查询

    listings = Listing.includes(:property).where(id: ids)

  2. iOS用的aes

    http://files.cnblogs.com/files/n1ckyxu/NickyAesTool.zip 使用方法 #define encryptKey @"你的加密密码" ...

  3. SVN中trunk、branches、tag的使用

     我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说明SVN里的trunk,branched,tags这个三个文件目录的用法 ...

  4. SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

    SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...

  5. php数据优化

    Array ( [0] => Array ( [id] => 19 [receive_id] => 41 [mac] => a4:3d:78:fc:49:50 [staytim ...

  6. How to change hostname on SLE

    修改/etc/HOSTNAME文件,在此文件中保存主机名,例如: linuxserv1 然后运行命令设置主机名 # /etc/rc.d/boot.localnet start 方法3. 运行 sysc ...

  7. Tomcat catalina.out日志使用log4j按天分割

    由于tomcat catalina.out日志不会自动分割, 一.日志分割所需包在附近中 1. 压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli-adapters.j ...

  8. mongodb权限管理

    说到mongodb就得先谈谈mongodb的用户组,和传统的关系型数据库不一样,mongodb并没有在创建应用时就要求创建权限管理组,所以类似于Robomongo这样的数据库可视化工具在创建conne ...

  9. http 状态码

    一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 ...

  10. Material Design学习笔记

    Wiki->移动开发->Android->Material Design-原质化设计 (友情链接:http://wiki.jikexueyuan.com/project/materi ...