当前位置: 首页 > news >正文

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

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;/*** 返回此资源的文件名。*/@NullableString 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类

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 优思学院|如何透过客户忠诚度分析决定六西格玛改善项目?
  • 01、爬虫学习入门
  • C语言数组练习--扫雷
  • 【目标检测】Yolo5基本使用
  • 【SQL 新手教程 1/20】SQL语言MySQL数据库 简介
  • 为什么 OPC UA 很重要
  • Redis与缓存
  • go-kratos 学习笔记(8) redis的使用
  • OpenCV 图像基础
  • 养宠空气净化器哪家好?养宠空气净化器质量好的牌子推荐
  • Ubuntu一键导入openVPN配置文件
  • PHP多功能投票系统源码小程序
  • 用来跳转的<a> 标签,原来还有这么多强大又实用的功能
  • 通信原理-思科实验五:家庭终端以太网接入Internet实验
  • 征服 Docker 镜像访问限制:KubeSphere v3.4.1 成功部署全攻略
  • @angular/forms 源码解析之双向绑定
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • css布局,左右固定中间自适应实现
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • mysql外键的使用
  • node入门
  • python 学习笔记 - Queue Pipes,进程间通讯
  • 诡异!React stopPropagation失灵
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前嗅ForeSpider教程:创建模板
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ### RabbitMQ五种工作模式:
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $ git push -u origin master 推送到远程库出错
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (9)目标检测_SSD的原理
  • (Python) SOAP Web Service (HTTP POST)
  • (笔试题)分解质因式
  • (二)WCF的Binding模型
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (三)模仿学习-Action数据的模仿
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)activiti-modeler 编辑器初步优化
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)linux 命令大全
  • (转)树状数组
  • .Net core 6.0 升8.0
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .Net Web项目创建比较不错的参考文章
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET命令行(CLI)常用命令
  • /etc/sudoers (root权限管理)
  • @Transient注解
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [《百万宝贝》观后]To be or not to be?