1. Resource简介
在Spring内部,针对于资源文件有一个统一的接口Resource表示。
其主要实现类有ClassPathResource、FileSystemResource、UrlResource、ByteArrayResource、ServletContextResource和InputStreamResource。
Resource接口中主要定义有以下方法:
- exists():用于判断对应的资源是否真的存在。
- isReadable():用于判断对应资源的内容是否可读。需要注意的是当其结果为true的时候,其内容未必真的可读,但如果返回false,则其内容必定不可读。
- isOpen():用于判断当前资源是否代表一个已打开的输入流,如果结果为true,则表示当前资源的输入流不可多次读取,而且在读取以后需要对它进行关闭,以防止内存泄露。该方法主要针对于InputStreamResource,实现类中只有它的返回结果为true,其他都为false。
- getURL():返回当前资源对应的URL。如果当前资源不能解析为一个URL则会抛出异常。如ByteArrayResource就不能解析为一个URL。
- getFile():返回当前资源对应的File。如果当前资源不能以绝对路径解析为一个File则会抛出异常。如ByteArrayResource就不能解析为一个File。
- getInputStream():获取当前资源代表的输入流。除了InputStreamResource以外,其它Resource实现类每次调用getInputStream()方法都将返回一个全新的InputStream。
Resource接口的实现类
-
ClassPathResource:通过 ClassPathResource 以类路径的方式进行访问;
-
FileSystemResource:通过 FileSystemResource 以文件系统绝对路径的方式进行访问。FileSystemResource还可以往对应的资源文件里面写内容,当然前提是当前资源文件是可写的,这可以通过其isWritable()方法来判断。FileSystemResource对外开放了对应资源文件的输出流,可以通过getOutputStream()方法获取到。
-
ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
-
ServletContextResource是针对于ServletContext封装的资源,用于访问ServletContext环境下的资源。
ServletContextResource持有一个ServletContext的引用,通过 ServletContextResource 以相对于Web应用根目录的方式进行访问。其底层是通过ServletContext的getResource()方法和getResourceAsStream()方法来获取资源的。 -
UrlResource可用来代表URL对应的资源,它对URL做了一个简单的封装。通过给定一个URL地址,我们就能构建一个UrlResource。其底层是通过java.net.URL来访问资源,当然它也支持File格式,如“file:”。
-
ByteArrayResource是针对于字节数组封装的资源,它的构建需要一个字节数组。
-
InputStreamResource是针对于输入流封装的资源,它的构建需要一个输入流。
最常用的有四个:
- ClassPathResource
- FileSystemResource
- ServletContextResource
- UrlResource
2. 通过ResourceLoader获取资源
ResourceLoader 接口是用来加载 Resource 对象的。它通过一个精确路径的地址信息进行加载Resource,也可以通过Ant风格的地址描述加载匹配的Resource。
Ant路径通配符加载Resource
Ant路径通配符支持?,*,**
。
注意通配符匹配不包括目录分隔符“/”。
? | 匹配任何单字符 |
* | 匹配0或者任意数量的字符 |
** | 匹配0或者更多的目录 |
匹配样例
/app/*.x | 匹配(Matches)所有在app路径下的.x文件 |
/app/p?ttern | 匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern |
/**/example | 匹配(Matches) /app/example, /app/foo/example, 和 /example |
/app/**/dir/file. | 匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java |
/*/.jsp | 匹配(Matches)任何的.jsp 文件 |
属性:
最长匹配原则(has more characters)
说明,URL请求/app/dir/file.jsp
,现在存在两个路径匹配模式/**/*.jsp
和/app/dir/*.jsp
,那么会根据模式/app/dir/*.jsp
来匹配
精确路径加载Resource
为了更加精确表示Resource类型,可以加入对应的前缀标识来说明。
如路径:com/baobaotao/beanfactory/bean.xml
classpath: | classpath:com/baobaotao/beanfactory/bean.xml | 从类路径中加载资源,资源文件可以在标准的文件系统中,也可以在jar或者zip的类包中 |
file: | file:/conf/com/baobaotao/beanfactory/bean.xml | 使用URLResource从文件系统目录中装载资源,可采用绝对或相对路径。 |
file: | file:/conf/com/baobaotao/beanfactory/bean.xml | 使用URLResource从文件系统目录中装载资源,可采用绝对或相对路径。 |
http:// | http://www.baobaotao/resource/bean.xml | |
ftp: | ftp://www.baobaotao.com/resource/bean.xml | 使用UrlResource从FTP服务器中装载资源 |
com/baobaotao/beanfatory/beans.xml | 根据ApplicationContext具体实现类采用对应的类型的Resource |
classpath与classpath*的区别
准备工作
在项目的“resources”创建“META-INF”目录,然后在其下创建一个“INDEX.LIST”文件。同时在“org.springframework.beans-3.0.5.RELEASE.jar”和“org.springframework.context-3.0.5.RELEASE.jar”两个jar包里也存在相同目录和文件。然后创建一个“LICENSE”文件,该文件存在于“com.springsource.cn.sf.cglib-2.2.0.jar”里。
“classpath”: 用于加载类路径(包括jar包)中的一个且仅一个资源;对于多个匹配的也只返回一个,所以如果需要多个匹配的请考虑“classpath*:”前缀;
对于匹配多个资源的情况下,会优先返回相对于本工程中下面的classpath路径下的匹配的资源。
@Test
public void testClasspathPrefix() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载
Resource[] resources=resolver.getResources("classpath:META-INF/INDEX.LIST");
Assert.assertEquals(1, resources.length);
//只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载
resources = resolver.getResources("classpath:META-INF/*.LIST");
Assert.assertTrue(resources.length == 1);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
“classpath*”: 用于加载类路径(包括jar包)中的所有匹配的资源。带通配符的classpath使用“ClassLoader”的“Enumeration getResources(String name)”方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。如“classpath:META-INF/*.LIST”将首先加载通配符之前的目录“META-INF”,然后再遍历路径进行子路径匹配从而获取匹配的资源。
@Test
public void testClasspathAsteriskPrefix () throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResources("META-INF")加载非模式路径部分
//然后进行遍历模式匹配
Resource[] resources=resolver.getResources("classpath*:META-INF/INDEX.LIST");
Assert.assertTrue(resources.length > 1);
//将加载多个模式匹配的Resource
resources = resolver.getResources("classpath*:META-INF/*.LIST");
Assert.assertTrue(resources.length > 1);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
结论
在声明资源地址路径的时候,可以混合使用Ant路径通配符和前缀标识。
如: classpath:com/**/test.xml
: 匹配com路径下(当前目录及其子孙目录)的test.xml文件;
相关推荐
1. 配置文件加载:Spring应用通常需要加载外部的配置文件,如applicationContext.xml,可以使用ClassPathResource从类路径加载。 2. 文件上传下载:在处理文件上传和下载时,Resource可以帮助我们处理临时文件或存储...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
虽然这不是Spring ClassPathResource的直接功能,但你可以扩展Spring的服务,以在加载或处理资源后添加此类功能。 在实际项目中,ClassPathResource常用于加载数据库连接配置、邮件服务器设置、国际化资源文件等。...
在Spring框架中,`resource`是一个非常重要的概念,它主要用于管理和访问各种类型的资源,如文件、数据库连接、网络资源等。在本场景中,我们关注的是如何利用Spring的`Resource`接口来读取配置文件。这在Java应用...
Spring会使用当前线程的ClassLoader的getResource方法来获取资源的URL。如果当前线程的ClassLoader无法获取到资源,Spring会转而使用加载org.springframework.util.ClassUtils类的ClassLoader。 在Spring加载配置...
Spring提供了`ClassPathResource`类,可以用来加载类路径下的资源,包括jar包内的文件。例如,如果你的jar包名为`mylib.jar`,配置文件为`myconfig.xml`,你可以这样加载: ```java Resource resource = new Class...
在Spring框架中,`ClassPathResource`是一个非常重要的类,用于加载类路径(classpath)下的资源文件,如XML配置文件。在实际开发中,我们经常需要从类路径中读取这些资源来初始化bean或其他配置。本示例将详细介绍...
Spring Boot加载资源路径配置和Classpath问题解决 Spring Boot加载资源路径配置是指在Spring Boot应用程序中,如何正确地加载资源文件的路径配置。资源文件是指项目中需要加载的文件,如配置文件、模板文件、类...
2. **ClassPathResource**:主要用于加载类路径(classpath)下的资源,特别适用于Web应用。它能自动查找`WEB-INF/classes`目录下的资源,无需指定协议。例如,`ClassPathResource cr = new ClassPathResource("book...
### Spring启动时根据配置文件加载不同文件的知识点详解 #### 一、背景介绍 在实际的应用开发中,根据运行环境的不同(例如开发环境、测试环境、生产环境等),应用程序往往需要连接不同的数据库或其他资源。为了...
`ApplicationContext` 是 Spring 的核心接口之一,用于提供Bean的生命周期管理和资源访问服务。它可以通过以下两种常见实现类来加载多个配置文件: - `ClassPathXmlApplicationContext`:从类路径(CLASSPATH)中...
Spring实战之ResourceLoaderAware加载资源用法示例 资源摘要信息主要介绍了Spring实战之ResourceLoaderAware加载资源用法,结合实例形式分析了Spring使用ResourceLoaderAware加载资源相关配置与操作技巧。 一、...
Spring不仅加载bean定义,还能加载其他资源,如数据库连接配置、消息源等。这通过`Resource`接口和其实现类实现。 10. **扩展性**: Spring加载机制还支持自定义加载逻辑,比如通过实现`...
- **Resource接口**:Spring提供了一个统一的Resource接口来访问不同类型的资源。 - **ResourceLoader接口**:提供了获取Resource的方法,通常由ApplicationContext实现。 #### 3.2 内置Resource实现 - **ClassPath...
解决Spring Boot项目中下载资源文件为空的问题,关键在于理解jar包内的文件结构和Spring Boot的资源加载机制。正确配置应用、构建工具以及代码中的资源访问路径,通常能有效地解决这类问题。在实际开发中,确保进行...
4. **资源加载**:Spring使用`Resource`接口来表示资源,它可以是文件、URL、输入/输出流等。`ClassPathResource`、`FileSystemResource`和`UrlResource`是其常见实现,分别用于加载类路径、文件系统和URL路径的资源...
此外,Spring还提供了`ResourceLoader`和`ApplicationContext`,它们是处理和加载资源的主要工具。 在Java开发中,经验技巧也是至关重要的。这部分可能会涵盖如何有效地使用Spring的注解驱动开发,比如`@Autowired`...
Spring通过`ResourceLoader`接口来加载资源,而`ApplicationContext`实现了`ResourceLoader`,因此它具备加载资源的能力。当遇到如`classpath:`或`file:`的前缀时,Spring会解析这些前缀并使用相应的加载策略来获取...
`spring-context`还支持AOP(面向切面编程)、事件传播、国际化以及资源加载等功能。 `spring-webmvc`模块则是Spring MVC(Model-View-Controller)的实现,是Web应用的核心组件。它处理HTTP请求,通过...
4. Spring框架:Spring框架的`Resource`接口和`ResourceLoader`类提供了高级的资源操作,支持从不同来源(包括`jar`包)加载资源。 5. 配置文件:在`jar`包中常包含配置文件,如`application.properties`,可以使用...