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类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cloud Native 安全实践解析

Cloud Native 安全实践解析 一、Cloud Native概述 Cloud Native&#xff08;云原生&#xff09;是一种构建和运行应用程序的方法&#xff0c;它充分利用了云计算的弹性、可扩展性和多租户特性。云原生应用通常被设计成微服务架构&#xff0c;利用容器化技术进行部署和管理&am…

springboot电影院线上购票系统-计算机毕业设计源码68220

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统流程分析 2.2.1 添加信息流程 2.2.2 修改信息流程 2.2.3 删除信息流程 2.3 系统功能分析 2.…

Fireflyrk3288 ubuntu18.04添加Qt开发环境、安装mysql-server

1、创建一台同版本的ubuntu18.04的虚拟机 2、下载rk3288_ubuntu_18.04_armhf_ext4_v2.04_20201125-1538_DESKTOP.img 3、创建空img镜像容器 dd if/dev/zero ofubuntu_rootfs.img bs1M count102404、将该容器格式化成ext4文件系统 mkfs.ext4 ubuntu_rootfs.img5、将该镜像文件…

起薪4万的AI产品经理自述:一个算法模型是怎么训练出来的?

起薪4万的AI产品经理自述&#xff1a;一个算法模型是怎么训练出来的&#xff1f; 这篇文章&#xff0c;我们继续来讲模型构建的其他 3 个环节&#xff1a;模型训练、模型验证和模型融合。 模型训练 模型训练是通过不断训练、验证和调优&#xff0c;让模型达到最优的一个过程。…

切割01串问题(dp动态规划问题)

题目概述&#xff1a; 给定一个长度为 &#x1d45b; 的 01 串&#xff0c;定义如下操作为一次 “切割”&#xff1a; 将长度大于 1 的字符串分割为两个非空的连续字串&#xff0c;记分割出来的左侧字串 a 中 0 的出现次数为 C 0 C_0 C0​&#xff0c;右侧字串 b 中 1 出现的…

ChatGPT:Java 的文档标准 OAS 是什么的缩写

ChatGPT&#xff1a;Java 的文档标准 OAS 是什么的缩写 OAS 是 “OpenAPI Specification” 的缩写。OpenAPI Specification 是一个用于描述和定义 RESTful APIs 的标准。最初由 Swagger 开发&#xff0c;现在由 OpenAPI Initiative 维护。OAS 使用一种标准的格式&#xff08;通…

【人工智能】穿越科技迷雾:解锁人工智能、机器学习与深度学习的奥秘之旅

文章目录 前言一、人工智能1. 人工智能概述a.人工智能、机器学习和深度学习b.人工智能发展必备三要素c.小案例 2.人工智能发展历程a.人工智能的起源b.发展历程 3.人工智能的主要分支 二、机器学习1.机器学习工作流程a.什么是机器学习b.机器学习工作流程c.特征工程 2.机器学习算…

基于GEC6818开发板+Linux+Qt设计的智能养老院出入管理系统

一、前言 1.1 项目介绍 【1】项目功能介绍 随着我国老龄化进程的加快,养老问题日益突出,如何有效保障老年人的生活质量与安全成为社会关注的重点。智能化、信息化技术的发展为解决这一问题提供了新的思路和手段。基于Linux系统的智能养老院出入管理系统应运而生,为了实现…

Thinkphp仿华为商城源码/红色风格电脑手机数码商城系统网站源码

Thinkphp仿华为商城&#xff0c;主要实现了商品首页展示、用户意见、商品分类列表、商品搜索、商品详细展示、购物车、订单生成、在线付款、以及个人中心完善个人资料、用户修改收货地址、余额查询、消费查询、订单管理、商品评价、热销商品和最近商品浏览&#xff1b; 后台是…

大模型的架构演进史——为什么Decoder-Only成为最终的胜利者

文章目录 大模型的架构encoder onlydecoder nolyencoder-decoder为什么现在decoder-only为主流 大模型的架构 encoder only 使用encoder-only的模型主要的思路是通过编码器&#xff0c;将大量文本、时序数据等资料进行编码、压缩&#xff0c;达到进一步抽象理解输入数据的能力…

WEB前端12-axios基础

Vue2-axios基础 1.axios基本概念 在现代的前端开发中&#xff0c;处理网络请求是至关重要的一部分。Axios 是一个流行的基于 Promise 的 HTTP 客户端&#xff0c;它可以在浏览器和 Node.js 环境中使用。它的设计简单易用&#xff0c;支持并行请求、拦截器、CSRF 防护等特性&a…

【JavaScript】函数的动态传参

Javacript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript基于原型编程、多范式的动态脚本语言&…

Linux 常用命令之文件处理

Linux 文件处理命令指南 文件查看命令 cat (Concatenate and display files) # 显示文件内容 cat file.txt# 显示多个文件的内容 cat file1.txt file2.txt# 将文件内容合并并输出到新文件 cat file1.txt file2.txt > combined.txt# 以行号显示文件内容 cat -n file.txtta…

写代码对人的影响

1 代码是需要跑起来的&#xff0c;不能你写了一段代码运行不了 2 代码过程中有大量的bug&#xff0c;经常异常报错&#xff0c;你需要花费时间去解决 对人的影响就是解决问题的态度得到强化&#xff0c;解决问题要比坚持正确困难&#xff0c;坚持正确只是需要自然而然的努力&…

淘宝NPM镜像地址已经改了,2022年以前发布的相关内容的博文已经没参考价值

http://npm.taobao.org和 http://registry.npm.taobao.org 已于2022.06.30正式下线和停止DNS解析 淘宝NPM镜像站的新域名为 http://npmmirror.com http://registry.npm.taobao.org > https://registry.npmmirror.com windows系统在命令行窗口下执行如下命令即可&#xff1a…

C++ primer plus 第16章string 类和标准模板库, 算法的通用特征

C primer plus 第16章string 类和标准模板库, 算法的通用特征 C primer plus 第16章string 类和标准模板库, 算法的通用特征 文章目录 C primer plus 第16章string 类和标准模板库, 算法的通用特征16.6.2 算法的通用特征 16.6.2 算法的通用特征 正如您多次看到的&#xff0c;…

掌握SQL Server的PowerShell魔法:自动化数据库管理的艺术

掌握SQL Server的PowerShell魔法&#xff1a;自动化数据库管理的艺术 SQL Server与PowerShell的结合为数据库管理员(DBA)提供了一种强大的自动化数据库管理工具。通过PowerShell&#xff0c;可以执行复杂的数据库任务&#xff0c;从简单的查询到复杂的数据迁移和备份策略的实现…

Python接口自动化测试框架(实战篇)-- 数据库操作MySQL

文章目录 一、前言二、数据库什么是数据验证为什么需要操作数据库做数据验证?现在回到怎样做数据验证的问题上来 三、[PyMSQL](https://pypi.org/project/pymssql/)pymysql如何操作数据库实际应用 四、总结 一、前言 说起数据库的操作&#xff0c;咱们应该保持一颗敬畏的心&a…

Ubuntu安装terminator教程

Terminator 是一个高级的终端仿真器,专为 Linux 和 Unix 系统设计。它的主要特点是提供了丰富的多窗口和多标签功能,使用户能够在一个窗口中管理多个终端会话。这对于系统管理员、开发人员以及需要同时运行多个命令行任务的用户来说,极为方便。 一、安装 1、更新包 sudo a…