Spring 源码---------Spring Core

张开发
2026/4/18 13:46:07 15 分钟阅读

分享文章

Spring 源码---------Spring Core
一 基本描述org.springframework.core.io.ResourceLoader是 Spring 框架中的一个关键接口它定义了如何获取资源例如类路径资源、文件系统资源或网页资源的策略。这个接口是 Spring 资源加载抽象的核心使得应用程序可以从不同的资源位置以统一的方式加载资源。二 主要功能统一资源加载ResourceLoader提供了一个标准化的方法来加载资源不论资源是存放在类路径、文件系统、网络URL还是其他位置。资源位置解析根据提供的资源字符串位置如 classpath:, file:, http:ResourceLoader可以确定资源的类型并为其创建相应的Resource实例。返回Resource实例通过Resource getResource(String location)方法ResourceLoader返回一个Resource对象代表了指定位置的资源。这使得读取和操作资源变得简单且统一。与ClassLoader的交互ResourceLoader通过ClassLoader getClassLoader()方法返回与其关联的ClassLoader。这使得资源加载策略可以与特定的类加载器关联。扩展性ResourceLoader是一个接口这意味着我们可以实现自己的资源加载策略或者扩展默认的策略以满足特定需求。内置实现与整合Spring 提供了默认的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(); }四 主要实现DefaultResourceLoade这是基本的资源加载器实现。它可以处理 classpath: 前缀的资源如果没有提供这样的前缀它会尝试使用类加载器或文件系统来加载资源。五 最佳实践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所有的 SpringApplicationContext都实现了ResourceLoader。这意味着我们可以使用 Spring 上下文本身来加载资源。ResourceResourceLoader返回Resource对象它代表实际的资源可以是文件系统中的文件、类路径资源、URLs 等。Resource提供了访问和读取资源内容的方法。ResourcePatternResolver这是ResourceLoader的扩展可以解析给定的位置模式以加载多个资源。PathMatchingResourcePatternResolver是它的主要实现。ResourceEditor这是一个属性编辑器用于将字符串转换为Resource对象。它内部使用ResourceLoader来执行转换。ResourceLoaderAware这是一个特殊的接口任何 bean 如果实现了它那么它就可以在被创建时获得对ResourceLoader的引用这样它就可以自己加载资源。EmbeddedValueResolverAware一些组件如属性占位符处理器可能需要解析值中的动态部分。它们可以使用ResourceLoader作为解析这些值的一部分特别是当值代表资源位置时。PathMatchingResourcePatternResolver它是ResourcePatternResolver的一个实现它扩展了ResourceLoader来处理以 classpath*: 开头的资源模式这允许加载所有匹配的资源而不仅仅是第一个找到的资源。七 常见问题加载类路径资源使用前缀 classpath:例如loader.getResource(classpath:myconfig.xml)。加载文件系统资源使用前缀 file:例如loader.getResource(file:/path/to/myconfig.xml)。加载URL资源直接使用 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注解可以解析属性值中的资源路径。

更多文章