spring-resources/spring-resource-resourceLoader/README.md
✒️ 作者 - Lex 📝 博客 - 掘金 📚 源码地址 - github
Spring 资源抽象
路径和模式解析
classpath*:com/example/**/*.xml。理解不同的资源类型
org.springframework.core.io.ResourceLoader 是 Spring 框架中的一个关键接口,它定义了如何获取资源(例如类路径资源、文件系统资源或网页资源)的策略。这个接口是 Spring 资源加载抽象的核心,使得应用程序可以从不同的资源位置以统一的方式加载资源。
统一资源加载
ResourceLoader 提供了一个标准化的方法来加载资源,不论资源是存放在类路径、文件系统、网络URL还是其他位置。资源位置解析
ResourceLoader 可以确定资源的类型,并为其创建相应的 Resource 实例。返回 Resource 实例
Resource getResource(String location) 方法,ResourceLoader 返回一个 Resource 对象,代表了指定位置的资源。这使得读取和操作资源变得简单且统一。与 ClassLoader 的交互
ResourceLoader 通过 ClassLoader getClassLoader() 方法返回与其关联的 ClassLoader。这使得资源加载策略可以与特定的类加载器关联。扩展性
ResourceLoader 是一个接口,这意味着我们可以实现自己的资源加载策略,或者扩展默认的策略以满足特定需求。内置实现与整合
ResourceLoader 实现,如 DefaultResourceLoader。但更重要的是,org.springframework.context.ApplicationContext 也实现了 ResourceLoader,这意味着 Spring 上下文本身就是一个资源加载器。ResourceLoader 接口为 Spring 框架定义了资源加载策略。它提供了获取资源的方法,并公开了其使用的 ClassLoader。通过这种策略,资源可以从各种来源(如类路径、文件系统等)以统一方式加载。这提供了资源加载的灵活性和一致性,并支持各种资源描述符,如 URL、类路径等。此外,它还允许对资源句柄进行多次重新使用和读取。
/**
* 用于加载资源(例如类路径或文件系统资源)的策略接口。
* 一个 ApplicationContext 需要提供此功能以及扩展的 ResourcePatternResolver 支持。
*
* DefaultResourceLoader 是一个独立的实现,可在 ApplicationContext 外部使用,并被 ResourceEditor 使用。
*
* 当在 ApplicationContext 中运行时,类型为 Resource 和 Resource[] 的 Bean 属性可以从字符串中填充,使用特定上下文的资源加载策略。
*
* @author Juergen Hoeller
* @since 10.03.2004
*/
public interface ResourceLoader {
/** 用于从类路径加载的伪 URL 前缀:"classpath:"。 */
String CLASSPATH_URL_PREFIX = ResourceUtils.CLASSPATH_URL_PREFIX;
/**
* 返回指定资源位置的 Resource 句柄。
* 该句柄应始终是一个可重用的资源描述符,允许进行多次 Resource#getInputStream() 调用。
* 必须支持完全限定的 URLs,例如 "file:C:/test.dat"。
* 必须支持类路径伪-URLs,例如 "classpath:test.dat"。
* 应支持相对文件路径,例如 "WEB-INF/test.dat"。
* (这将是实现特定的,通常由 ApplicationContext 实现提供。)
* 请注意,Resource 句柄并不意味着资源存在;我们需要调用 Resource#exists 来检查其存在性。
*
* @param location 资源位置
*/
Resource getResource(String location);
/**
* 公开此 ResourceLoader 使用的 ClassLoader。
* 需要直接访问 ClassLoader 的客户端可以与 ResourceLoader 以统一的方式这样做,而不是依赖线程上下文 ClassLoader。
*
* @return ClassLoader(仅当连系统 ClassLoader 都不可访问时为 null)
*/
@Nullable
ClassLoader getClassLoader();
}
DefaultResourceLoader
classDiagram
direction BT
class ResourceLoader {
<<interface>>
+ getResource(location) : Resource
+ getClassLoader() : ClassLoader
}
class DefaultResourceLoader {
-ClassLoader classLoader
}
DefaultResourceLoader ..|> ResourceLoader
DefaultResourceLoader
使用 DefaultResourceLoader 从不同的资源(类路径和文件系统)加载内容。
public class DefaultResourceLoaderDemo {
public static void main(String[] args) {
DefaultResourceLoader loader = new DefaultResourceLoader();
// 从类路径加载资源
Resource classpathResource = loader.getResource("classpath:application.properties");
try (InputStream is = classpathResource.getInputStream()) {
// 读取和处理资源内容
System.out.println("Classpath = "+ new String(is.readAllBytes()));
} catch (IOException e) {
e.printStackTrace();
}
// 加载文件系统中的资源
Resource fileResource = loader.getResource("file:/idea-work-space-xcs/spring-reading/spring-resources/spring-resource-resourceLoader/myfile1.txt");
try (InputStream is = fileResource.getInputStream()) {
// 读取和处理资源内容
System.out.println("File = "+ new String(is.readAllBytes()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果发现
application.properties 。这意味着在我们的项目的类路径中,有这个文件。myfile1.txt。这些文件位于我们之前在代码中硬编码的文件路径 /idea-work-space-xcs/spring-reading/spring-resources/spring-resource-resourceLoader/ 下。Classpath Exists= true
File Exists = true
ApplicationContext
ApplicationContext 都实现了 ResourceLoader。这意味着我们可以使用 Spring 上下文本身来加载资源。Resource
ResourceLoader 返回 Resource 对象,它代表实际的资源,可以是文件系统中的文件、类路径资源、URLs 等。Resource 提供了访问和读取资源内容的方法。ResourcePatternResolver
ResourceLoader 的扩展,可以解析给定的位置模式以加载多个资源。PathMatchingResourcePatternResolver 是它的主要实现。ResourceEditor
Resource 对象。它内部使用 ResourceLoader 来执行转换。ResourceLoaderAware
ResourceLoader 的引用,这样它就可以自己加载资源。EmbeddedValueResolverAware
ResourceLoader 作为解析这些值的一部分,特别是当值代表资源位置时。PathMatchingResourcePatternResolver
ResourcePatternResolver 的一个实现,它扩展了 ResourceLoader 来处理以 "classpath*:" 开头的资源模式,这允许加载所有匹配的资源,而不仅仅是第一个找到的资源。加载类路径资源
loader.getResource("classpath:myconfig.xml")。加载文件系统资源
loader.getResource("file:/path/to/myconfig.xml")。加载URL资源
loader.getResource("http://www.example.com/config.xml")。资源不存在
Resource.exists() 方法检查资源是否存在。确保路径或位置正确,并且资源真的存在于预期的位置。如何读取资源内容
Resource 对象中获取 InputStream,例如:resource.getInputStream()。从 Resource 获取到文件路径
Resource.getFile()。但请注意,这并不总是有效的,例如当资源实际上是一个类路径资源或URL资源时。加载匹配特定模式的多个资源
ResourcePatternResolver 或其实现 PathMatchingResourcePatternResolver。自动注入 ResourceLoader
ResourceLoaderAware 接口,Spring 将自动为我们的 bean 提供 ResourceLoader 的引用。扩展或自定义资源加载机制
ResourceLoader 或继承现有的实现,如 DefaultResourceLoader。加载资源时考虑环境或属性占位符
PropertyPlaceholderConfigurer 或 PropertySourcesPlaceholderConfigurer 与 @Value 注解可以解析属性值中的资源路径。