首页 > 其他分享 >Spring Core——资源加载与访问(Resource)

Spring Core——资源加载与访问(Resource)

时间:2024-07-28 23:53:09浏览次数:14  
标签:Core Resource Spring 接口 访问 IOException throws 资源

Spring 中的资源加载

在Spring框架中,Resource接口用于简化和统一对各种底层资源(如xxx.xml、application.yml、application.properties等文件、类路径资源、URL等)的访问。它提供了一个通用的抽象层,使开发者无需关注不同资源类型的具体访问方式。在Java开发中,访问资源是一个常见需求,例如读取配置文件、加载图片、音频等。Java标准库为不同类型的资源提供了各自的访问方式。例如,文件系统资源通常使用java.io.File类,类路径资源可能使用ClassLoadergetResourcegetResourceAsStream方法,而网络资源则可以通过java.net.URL类进行访问。这些不同的机制意味着开发者需要熟悉多种方式来访问资源,这可能导致代码复杂性增加、重复代码出现以及更高的错误风险。

为了解决这些问题并提供一个更统一的资源访问方式,Spring框架引入了Resource接口。Resource接口为所有资源类型提供了一个通用的抽象,使得无论资源来自文件系统、类路径还是网络,开发者都可以通过一致的方式进行访问。这不仅简化了资源访问的代码,还提高了代码的可维护性和可读性。此外,Spring还提供了多个Resource接口的实现类,例如FileSystemResource、ClassPathResource、UrlResource等,这些类专门用于处理特定类型的资源。通过使用这些实现类,开发者可以轻松地从不同来源获取资源,而不必担心底层的实现细节。总之,Resource接口及其实现类为资源访问提供了一种高度抽象和简化的解决方案,是Spring框架中一个非常有用的功能。

本文将从Resource接口开始介绍,最后将介绍常用的Resources接口的实现类ResourceLoaderResourcePatternResolverDocumentLoader等。

Resource接口

Spring中将所有的资源抽象成了Resource对象,对于不同的资源类型有着不同的实现类,它为访问底层资源提供了一个统一的抽象,从而使得代码可以独立于实际资源的类型。首先我们打开Resource源代码如下所示:

/**
 * 用于描述资源的接口,该接口抽象了底层资源的实际类型,如文件或类路径资源。
 *
 * <p>对于每个资源,如果它在物理形式上存在,都可以打开一个输入流,但只有某些资源才能返回 URL 或文件句柄。具体行为取决于其实现。
 */
public interface Resource extends InputStreamSource {

    /**
     * 判断此资源是否在物理形式上真正存在。
     */
    boolean exists();

    /**
     * 指示是否可以通过 {@link #getInputStream()} 读取此资源的非空内容。
     * 实际的内容读取可能仍然失败。
     */
    default boolean isReadable() {
        return exists();
    }

    /**
     * 指示此资源是否代表一个打开的流的句柄。
     * 如果为 true,则输入流不能被多次读取,并且在读取后必须被关闭,以避免资源泄露。
     */
    default boolean isOpen() {
        return false;
    }

    /**
     * 判断此资源是否代表文件系统中的文件。
     */
    default boolean isFile() {
        return false;
    }

    /**
     * 返回此资源的 URL 句柄。
     */
    URL getURL() throws IOException;

    /**
     * 返回此资源的 URI 句柄。
     */
    URI getURI() throws IOException;

    /**
     * 返回此资源的文件句柄。
     */
    File getFile() throws IOException;

    /**
     * 返回一个 {@link ReadableByteChannel}。
     */
    default ReadableByteChannel readableChannel() throws IOException {
        return Channels.newChannel(getInputStream());
    }

    /**
     * 确定此资源的内容长度。
     */
    long contentLength() throws IOException;

    /**
     * 确定此资源的最后修改时间戳。
     */
    long lastModified() throws IOException;

    /**
     * 创建相对于此资源的资源。
     */
    Resource createRelative(String relativePath) throws IOException;

    /**
     * 返回此资源的文件名。
     */
    @Nullable
    String getFilename();

    /**
     * 返回此资源的描述,用于在处理资源时的错误输出。
     */
    String getDescription();
}

可以看见Resource接口是InputStreamSource的子类,我们可以看一下InputStreamSource的源码如下:

/**
 * 表示可以提供输入流的资源或对象的接口。
 */
public interface InputStreamSource {
	/**
	 * 返回基础资源内容的 InputStream。
	 * 期望每次调用都会创建一个新的流。
	 * @return 基础资源的输入流(不能为 null)
	 * @throws java.io.FileNotFoundException 如果基础资源不存在
	 * @throws IOException 如果无法打开内容流
	 */
	InputStream getInputStream() throws IOException;
}

ResourceLoader类

ResourcePatternResolver类

DocumentLoader类

标签:Core,Resource,Spring,接口,访问,IOException,throws,资源
From: https://blog.csdn.net/cj151525/article/details/140758384

相关文章

  • springboot学生宿舍管理系统
    源码+数据库+文档(LW)。开发技术:springbootmysqlhtml。内容:学生宿舍管理系统的主要使用者分为管理员、宿管员、学生和维修员,实现功能包括管理员:首页、系统用户(管理员、学生、宿管员、维修员)、楼宇管理、宿舍管理、学生管理、申请换寝、请假报备、报修申请、......
  • SpringBoot奶茶店点餐系统
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容SpringBoot奶茶店点餐系统开题报告一、选题背景随着奶茶行业的快速发展和消费者口味的多样化,传统的点餐方式已经无法满足现代顾客对便捷、高效体......
  • SpringBoot的分层解耦(三层架构,控制反转,依赖注入)
    目录一、项目结构二、案例引入三、三层架构1.介绍2.代码拆分(1)控制层Controller(2)业务逻辑层Service业务接口业务实现类(3)数据访问层Dao数据访问接口数据访问实现类(4)接口测试四、解除耦合1.高内聚与低耦合2.控制反转和依赖注入3.解耦后的代码(1)控制层Co......
  • springboot项目嵌入式数据库驱动程序配置及使用方法
    自用文章,仅做参考。目录自用文章,仅做参考。项目创建依赖导入配置文件至此,数据库连接完成。基本用法数据库数据准备1.插入一行2.查询单行多列3.查询多行多列至此,关于springboot中使用嵌入式数据库的方法介绍完成。项目创建选择SQL中的JDBCAPI选型依赖导入......
  • SpringBoot应用零停机滚动更新
    目录1SpringBoot零停机滚动更新1.1引言1.2单体应用设计思路1.3单体应用实现代码1SpringBoot零停机滚动更新1.1引言在个人或者企业服务器上,总归有要更新代码的时候,普通的做法必须先终止原来进程,因为新进程和老进程端口是一个,新进程在启动时候,必定会出现端口占用的情况,但是......
  • 微服务安全——SpringSecurity6详解
    文章目录说明SpringSecurity认证快速开始设置用户名密码基于application.yml方式基于JavaBean配置方式设置加密方式自定义用户加载方式自定义登录页面前后端分离认证认证流程SpringSecurity授权web授权:基于url的访问控制自定义授权失败异常处理方法授权:基于注解的访......
  • springsecurity通过策略模式设置统一认证接口
     还是回到这张图:我们想不止使用数据库查找的方法去实现认证,而是使用一个统一的认证方法,首先需要修改DaoAuthenticationProvider内实现功能7的方法protectedvoidadditionalAuthenticationChecks(UserDetailsuserDetails,UsernamePasswordAuthenticationTokenauthenticatio......
  • Spring Boot 使用Apollo动态调整日志级别
    摘要:在SpringBoot项目中,借助Apollo动态修改配置的能力,结合Logback修改日志级别打印执行的SQL脚本。综述  在生产环境偶现测试环境未发现的SQL查询BUG,但由于线上关闭debug和trace级别日志导致缺少执行SQL、异常堆栈等日志信息,没有办法火速定位问题根源。面对这样的线上问题,通......
  • Spring 状态机极简使用
    Spring状态机极简使用本文不探讨状态机的思想与Spring状态机的架构,仅做快速实现参考。Spring状态机官方文档项目参考代码基于SpringBoot配置的快速集成案例maven依赖配置<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-s......
  • 实战: SpringBoot中5种增强的方法 : 加解密、脱敏、格式转换、时间时区处理(码到三十五)
    1.使用@JsonSerialize和@JsonDeserialize注解2.全局配置Jackson的ObjectMapper3.使用@ControllerAdvice配合@InitBinder4. 自定义HttpMessageConverter5.使用AOP进行切面编程结语在SpringBoot中,对接口的请求入参和出参进行自定义的增强或者修改,通常有以下......