Spring 学习笔记 Resource 资源

05.Spring 资源加载 - Resource 基本概念Spring 的 Resource 接口代表底层外部资源,提供了对底层外部资源的一致性访问接口。利用该接口可以表示不同形式(类型)的资源。 InputStreamSource 接口 public interface InputStreamSource { // 表示任意形式的资源都可以被转换成输入流 InputStream getInputStream() throws IO 阅读详情

Spring Resources


概述

在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理 URL 资源、File 资源、ClassPath相关资源等等。并且在 java 中 Java .net.URL 类和用于各种 URL 前缀的标准处理程序对于所有对底层资源的访问都不够充分。处理各种各样的资源需要使用到不同的接口,这就增加了系统的复杂性。

对此 Spring 提供了 Resource 接口来统一这些底层资源一致的访问。Resource 接口是一个更强大的接口,用于抽象对底层资源的访问。

public interface Resource extends InputStreamSource {

    boolean exists();

    boolean isOpen();

    URL getURL() throws IOException;

    File getFile() throws IOException;

    Resource createRelative(String relativePath) throws IOException;

    String getFilename();

    String getDescription();

}

Resource 继承了 InputStreamSource 下面是 InputStreamSource 的内容

public interface InputStreamSource {
    InputStream getInputStream() throws IOException;
}

方法解析:

  1. getInputStream():每次调用都会返回一个与资源对应的 InputStream 字节流,调用者有必要在使用后关闭该资源。
  2. exists():返回 true 表示当前资源存在。
  3. isOpen():返回 Resource 代表的资源是否已经被打开。如果返回 true,则只能读取一次不能多次读取 InputStream,然后关闭,以避免资源泄漏。对于所有常见的 Resource 实现一般返回 false。
  4. getURL():返回 Resource 代表资源对应的 java.util.URL 对象。
  5. getFile():返回 Resource 代表资源对应的 java.io.File 对象。
  6. createRelative(String relativePath):用于创建相对于当前 Resource 代表资源的资源,比如当前 Resource 代表文件资源 “d:/test/” 则 createRelative(“test.txt”) 将返回表文件资源 “d:/test/test.txt” Resource 资源。
  7. getFilename():返回 Resource 代表资源对应的文件路径。
  8. getDescription():返回 Resource 代表资源的描述符,通常就是资源的全路径(实际文件名或实际 URL 地址)。

Spring 框架自身就非常广泛使用 Resource,在我们的项目中也可以使用并且可以非常方便的获取到目标资源。

内置 Resource 接口实现

  1. UrlResource
  2. ClassPathResource
  3. FileSystemResource
  4. ServletContextResource
  5. InputStreamResource
  6. ByteArrayResource

UrlResource
UrlResource 封装了 java.net.URL,可用于访问通过 URL 访问的任何对象,比如文件、HTTP 资源、FTP 资源等等。所有 URL 都有一个标准化的字符串表示,因此可以使用适当的标准化前缀来表示不同 URL 类型的 URL。一般支持如下资源访问。

  1. file:用于访问文件系统路径
new UrlResource("file:d/xxx.txt");
  1. http:用于通过 http 协议访问资源
new UrlResource("http://地址");
  1. ftp: 用于通过 ftp 访问资源
new UrlResource("ftp://地址");

ClassPathResource
ClassPathResource 表示从类路径获取资源,它使用线程上下文类加载器、给定的类加载器来加载资源。classpath 资源存在于类路径中的文件系统中或 jar 包里。

ClassPathResource 常用构造器

public ClassPathResource(String path);
public ClassPathResource(String path, @Nullable ClassLoader classLoader);
public ClassPathResource(String path, @Nullable Class<?> clazz);
  1. public ClassPathResource(String path):使用默认的类加载器记载 path 类路径下的资源
  2. public ClassPathResource(String path, @Nullable ClassLoader classLoader):使用指定的类加载器加载 path 类路径下的资源
  3. public ClassPathResource(String path, @Nullable Class clazz):只用指定的类加载 path 类路径下的资源

FileSystemResource
FileSystemResource 是 Resource 实现支持 java.io 和 java.nio.file.Path 的处理。

ServletContextResource
ServletContextResource 是 web 应用资源,ServletContext 资源的实现。用于简化 servlet 容器的 ServletContext 接口的 getResource 操作和 getResourceAsStream 操作。

InputStreamResource
InputStreamResource 是基于 InputStream 的实现,参数是一个 InputStream 只有在没有特定场景下的 Resource 的时候才使用它。

public InputStreamResource(InputStream inputStream);
public InputStreamResource(InputStream inputStream, @Nullable String description);

ByteArrayResource
ByteArrayResource 是给定一个 byte[] 数组的实现创建 ByteArrayInputStream。

ResourceLoader

ResourceLoader 用于返回 Resource 的实例。

public interface ResourceLoader {
    Resource getResource(String location);
}

Spring 的 ApplicationContext 都实现了 ResourceLoader

  1. ClassPathXmlApplicationContext
  2. FileSystemXmlApplicationContext
  3. WebApplicationContext

因此可以使用 ApplicationContext 来获取资源实例,当在某个 ApplicationContext 实现类中调用 getResource 而参数没有指定特定的资源前缀时,将返回适合 ApplicationContext 实现实例的资源类型,下面是 ClassPathXmlApplicationContext 的执行代码

Resource template = ctx.getResource("some/resource/path/myTemplate.txt");

对于 ClassPathXmlApplicationContext 以上代码返回一个 ClassPathResource。
如果对 FileSystemXmlApplicationContext 实例执行相同的方法,它将返回FileSystemResource。对于 WebApplicationContext,它将返回一个 ServletContextResource。

另外也可以指定资源前缀比如 classpath: 强制使用 ClassPathResource 无论 ApplicationContext 实现实例类型是什么。

Resource template = ctx.getResource("classpath:some/resource/path/myTemplate.txt");

也可以使用其他前缀

Resource template = ctx.getResource("file:///some/resource/path/myTemplate.txt");
Resource template = ctx.getResource("https://myhost.com/resource/path/myTemplate.txt");

getResource 字符串参数对象转换为资源对象的策略

资源前缀示例说明
classpath:classpath:com/myapp/config.xml从 classpath 类路径加载
file:file:///data/config.xml从文件系统中作为 URL 加载
http:https://myserver/logo.png作为 URL 加载
(none)/data/config.xml根据 ApplicationContext 实现实例加载

ResourceLoaderAware
ResourceLoaderAware 接口是一个特殊的回调接口,通过对应的 ApplicationContext 注入。

public interface ResourceLoaderAware {
    void setResourceLoader(ResourceLoader resourceLoader);
}

当一个类实现 ResourceLoaderAware 接口时,Spring IoC 容器在加载该 bean 的时候将该 bean 类型识别为 ResourceLoaderAware 然后调用对应的 setResourceLoader(ResourceLoader resourceLoader) 方法并将 ApplicationContext 的实例的 getResource 方法返回实例传递进去

ApplicationContext 构建

ApplicationContext 的构建通常将字符串或字符串数组作为资源的位置路径。当字符串参数路径没有前缀时,加载 bean 的 Resource 实例依赖于 ApplicationContext 的实例。例如,考虑下面的例子,它创建了一个 ClassPathXmlApplicationContext:

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

appContext.xml 文件里的 bean 都是从类路径加载的,因为使用了 Classpathresource。

ApplicationContext 构建的通配符
构建 ApplicationContext 的参数路径可以是精确的路径 classpath:conf/appContext.xml 每个路径都有到目标资源的一对一映射。或者也可以包含特殊的字符 classpath*: 这种机制的一个用途是,当您需要进行依赖式的应用程序组装时。并且当使用以classpath*: 作为前缀的相同路径创建最终的 ApplicationContext 时,所有依赖包 classpath 都会自动被获取。

classpath 和 classpath* 区别

  1. classpath:用于加载类路径(包括jar包)中的一个且仅一个资源;对于多个匹配的也只返回一个。
  2. classpath* :用于加载类路径(包括jar包)中的所有匹配的资源。

注意:用 classpath*: 需要遍历所有的 classpath,所以加载效率会比较差一些尽量少使用。

华三R4900 G5服务器实战:用PMC P460-B4阵列卡配置RAID1+RAID6,并搞定CentOS 7.9安装(含热备盘设置) 本文详细解析了在华三R4900 G5服务器上使用PMC P460-B4阵列卡配置RAID1+RAID6混合阵列的全过程,包括热备盘设置和CentOS 7.9系统安装。通过实战步骤和性能优化建议,帮助企业IT人员高效部署高可用存储方案,特别适合需要数据冗余和系统稳定性的企业级应用场景。 阅读详情

相关推荐

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4288

关于Spring Boot中的getResources

关于Spring Boot中的getResources 在前一篇讲Spring Boot启动流程的文章中,在获取Initializers和Listeners的时候都会通过ClassLoader的getResources方法获取相关文件的全限定名。 今天着重分析一下ClassLoader.getResources,ClsasLoader.getResource,Class.getResource 1...

xuJingZhou的博客 3193

vivado2020.1使用vitis生成QSPI启动文件报错

在使用vivado2020.1使用vitis,生成QSPI启动文件时会报错,data2mem命令无法识别,这是因为data2mem是xilinx7series芯片的命令,当使用ultrascale/ultrascale+芯片时则需要使用updatemem命令,这或许是vitis的一个bug吧,明明选择的是ultrascale的芯片,却一直调用打她mem命令,挺麻烦的,需要手动执行,在XSCT console窗口执行的命令如下: updatemem -force -meminfo \ F:/xc7z35t/x

qq_32134427的博客 2336

关于Spring加载classpath与classpath*的过程剖析

提到Spring配置文件,我不知道各位想到的是什么,首先浮现在我脑海里面的就是classpath 和 classpath*。    网上有很多关于这个2个前缀分别能读到那些资源文件的文章,但是我相信仍然有大部分同学是迷糊的,或者说知其然不知其所以然。那么这篇文章就带你走进Spring源码,让你知其然,更知其所以然。    关于Spring Resource的资源类型以及继承体系我们已经在上一篇

老张 4万+

【毕设课设】基于YOLO v3与LSTM的水位智能识别系统(附完整源码+数据集)

本文详细介绍了基于YOLO v3与LSTM的水位智能识别系统的完整实现方案。该系统通过YOLO v3精准定位水位尺数字,结合LSTM-OCR进行序列识别,并融合霍夫变换检测刻度线,实现高精度水位自动读取。项目提供了从环境搭建、模型训练到集成部署的全流程指南,并附有完整源码和数据集,是理想的毕设课设实战项目。

php55的博客 608

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 496

【Spring】开发框架Spring核心技术含Resource接口详细讲解

【Spring】开发框架Spring核心技术含Resource接口详细讲解、认识Spring体系结构、AOP模块、Web模块、测试模块、loc与DI、Spring资源访问神器——Resource接口等

m0_75058342的博客 4523

交叉编译Qt6.5.3(RK3568开发板)

注意,如果使用其它版本的交叉编译器的话,请确保你的交叉编译器能够支持 C++17标准。为确保后续交叉编译没问题,需要确保开发板使用的GLIBC版本不小于2.34版本。到 linaro 网站上下载交叉编译工具,我下载的是 gcc-linaro-11.3.1-2022.06-x86_64_aarch64-linux-gnu.tar.xz。安装 CMake ,最低要求3.16版本,如果要静态编译,需要3.21及以上版本。我使用的3.27版本。:指定为最后交叉编译后的Qt6.5.3库的安装目录。

m0_46309425的博客 5098

SpringBoot项目中读取resource目录下的文件(六种方法)

源码里还是方法三、方法四,只不过做了一些封装,更方便开发。2)启动jar包指令。

weixin_63742275的博客 2万+

Windows 11“此应用已被管理员阻止运行”解决方案

通过本文介绍的两种方法,你应该能够解决Windows 11中“此应用已被管理员阻止运行”的问题。无论你选择创建新管理员账户还是禁用管理员批准模式,都请确保了解相关操作的风险,并根据你的实际需求做出选择。通过禁用“用户账户控制:以管理员批准模式运行所有管理员”设置,可以解决因系统安全设置导致的应用程序被阻止运行的问题。这种方法适用于那些希望简化管理员账户操作流程的用户,但需要注意可能带来的安全风险。通过创建并登录具有管理员权限的新账户,可以解决因系统安全设置导致的应用程序被阻止运行的问题。

mmoo_python的博客 1万+

微信小程序——01开发前的准备和开发工具

微信小程序——01开发前的准备和开发工具

总裁余(余登武)博客 1万+

Spring中Resource对象的获取

Resource对象是针对于资源文件的统一接口,即通过applicationContext.getResource方法我们可以将某个资源文件转化为Resource对象供我们使用 它的获取方法常用的有四种:classpath、file、http、none 第一步:建立xml以及测试类和资源文件config.txt xml http://www.w3.org/2001/XMLSchema-

张巍的博客 2643

R语言中的summarise函数和mutate函数用于计算分组占比。下面是关于这两个函数的详细介绍以及相应的源代码示例:

R语言中的summarise函数和mutate函数用于计算分组占比。

CodeByte的博客 1180

spring学习笔记 -- 资源访问(Resource接口)

  http://snkcxy.iteye.com/blog/1913796   概述:       主要介绍3种方式(当然不止三种,但是这三种基本能应付大多需求)FileSystemResource:以文件的绝对路径方式进行访问ClassPathResourcee:以类路径的方式访问ServletContextResource:web应用根目录的方式访问 主要公用方法介...

Hi, Sun 233

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spring学习笔记(2)文件资源访问接口Resource

spring 资源抽象接口下的几个常用实现类 实现类 说明 ClassPathResource 类路径下的资源,资源以相对类路径的方式表示 FileSystemResource 文件系统资源,资源以文件系统路径的的方式表示,如/home/root/test.txt ServletContextResource 为访问web上下文中的资源而设计的类,负责以相对于web应用

总结沉淀 1806

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Spring学习笔记】之【4.4 资源之Resource通配符路径】

4.4.1 使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源。 Ant路径通配符支持“?”、“*”、“**”,注意通配符匹配不包括目录分隔符“/”:“?”:匹配一个字符,如“config?.xml”将匹配“config1.xml”;...

weixin_33725239的博客 127

【Spring学习笔记】之【4.3 资源之Resource访问】

4.3.1 ResourceLoader接口 ResourceLoader接口用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类。java代码: public interface ResourceLoader { Resource getResource(String location); ...

weixin_33916256的博客 95

【Spring学习笔记】之【4.2 资源之内置Resource】

4.2.1 ByteArrayResource ByteArrayResource代表byte[]数组资源,对于“getInputStream”操作将返回一个ByteArrayInputStream。首先让我们看下使用ByteArrayResource如何处理byte数组资源:java代码package cn.javass.spring.chapter4; ...

weixin_34014555的博客 97

Spring学习笔记 -- 资源访问(Resource接口)

概述: 主要介绍3种方式(当然不止三种,但是这三种基本能应付大多需求)FileSystemResource:以文件的绝对路径方式进行访问ClassPathResourcee:以类路径的方式访问ServletContextResource:web应用根目录的方式访问 主要公用方法介绍(Resource接口下的)getFilename() : 获得文件名称contentLength()...

snkcxy的博客 329

Java学习之道:Spring学习笔记 -- 资源访问(Resource接口)

概述: 主要介绍3种方式(当然不止三种,但是这三种基本能应付大多需求) FileSystemResource:以文件的绝对路径方式进行访问 ClassPathResourcee:以类路径的方式访问 ServletContextResource:web应用根目录的方式访问主要公用方法介绍(Resource接口下的) getFilename() : 获得文件名称 contentLeng

Java小迷的专栏 950

Java学习之道:[续]Spring学习笔记 -- 资源访问(Resource接口)

概述:      本文介绍两种较为通用的spring 资源访问方式 UrlResource:可以通过类似 http://, ftp://, file:// 这样的url协议来访问资源资源加载器:可以通过资源地址表达式来加载资源,支持ant风格,更加灵活 说明:    本文只是为了讲述UrlResource和资源加载器的使用,测试代码粗糙,没有做完善的验证,实际应用请自

Java小迷的专栏 1082

【续】Spring学习笔记 -- 资源访问(Resource接口)

概述:      本文介绍两种较为通用的spring 资源访问方式 UrlResource:可以通过类似 http://, ftp://, file:// 这样的url协议来访问资源 资源加载器:可以通过资源地址表达式来加载资源,支持ant风格,更加灵活 说明:    本文只是为了讲述UrlResource和资源加载器的使用,测试代码粗糙,没有做完善的验证,实际应用请自行处理。 ...

snkcxy的博客 196

Spring之资源操作:Resource接口

🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️ 零基础学Java——小白入门必备🔥 重识C语言——复习回顾🔥 计算机网络体系———深度详讲 HCIP数通工程师-刷题与实战🔥🔥🔥 微信小程序开发——实战开发🔥 HarmonyOS 4.0 应用开发实战——实战开发🔥🔥🔥 Redis快速入门到精通——实战开发🔥🔥🔥

鱼干的博客 3723

Spring中Resource(资源)的获取

Spring中获取资源的方式一共有以下四种: 通过Resource接口获取资源 通过ResourceLoader接口获取资源 通过ApplicationContext获取资源 将resource注入到bean中的方式获取资源 下面是对每种方式的详细讲解 :1.通过Resource接口获取资源Resource接口的实现类有: 实现类 说明 ClassPathResource 通过类路径获

解忧杂货铺 1万+

Spring Resource加载资源

Spring提供了一个强大加载资源的机制,

xinluke的专栏 4033

spring核心技术之Resource资源理解

文章目录1 介绍**2 Resource 接口**resource接口提供哪些功能?3 spring为我们提供了哪些内置的Resource实现3.1 URLResource3.2 ClassPathResource3.3 FileSystemResource3.4 InputStreamResource3.5 ByteArrayResource4 ResourceLoader 资源加载5 Reso...

吃葡萄皮吐葡萄的博客 3638
上一篇: Spring 学习笔记 IoC 基础
下一篇: Spring 学习笔记 数据绑定,校验,BeanWrapper 与属性编辑器
一定要细心
博客等级 码龄12年 11粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值