Spring Resource

 java.net.URL 类可用于访问带有各种URL前缀的资源,但是对于访问一些资源还是不够方便。比如不能从类路径或者相对于ServletContext来获取资源。而Spring 的Resource接口,则可以通过类路径等方式来访问资源。

1 Resource接口

图 Resource接口及方法

getInputStream

定位并打开资源,返回一个输入流。

exists

判断资源是否存在。

isOpen

判断输入流是否打开,如果打开,则不能多次读取。

getDescription

通常返回资源的完全限定名或URL,常用于在报错时使用。

表 Resource的部分方法

2 Resource 的实现

UrlResource

用于需要通过URL访问的资源。

ClassPathResource

用于需要通过类路径访问的资源。可用当前线程的类加载器、给定的类加载器及给定的类来获取资源。

FileSystemResource

是java.io.File及java.nio.file.Path的资源实现。支持作为文件和URL的解析。

相对于java到File类,该类没有太大优势,File类也可以访问文件系统资源。

ServletContextResource

用于在ServletContext中获取资源。是以web项目的根目录作为相对路径。

InputStreamResource

通过给定InputStream输入流来获取资源。只有在没有特定资源实现时才应使用它。尽可能使用ByteArrayResource或其他Resource实现来替换。

与其他Resource实现类相比,这是已打开的输入流(其构造函数参数是一个Resource),如果需要将资源描述符保存在某处或者需要多次读取流,请不要使用它。

ByteArrayResource

通过给定字节流来获取资源。

表 Resource的实现类

注意:打包时,类文件里的其他文件(除.java文件外)会被忽略,需要将文件复制到resources文件夹下。

public class ResourceImpl {public static void main(String[] args) throws IOException {classPathResource();fileSystemResource();urlResource();inputStreamResource();}private static void urlResource() throws IOException {UrlResource urlResource = new UrlResource("file:/Users/huangzaizai/Desktop/huangmingfu/code/spring_resource/src/main/resources/article/res.properties");showPropertiesValue(urlResource.getInputStream(), "urlResource");}private static void classPathResource() throws IOException {ClassPathResource classPathResource = new ClassPathResource("res.properties", ResourceImpl.class);showPropertiesValue(classPathResource.getInputStream(),"classPathResource");}private static InputStream fileSystemResource() throws IOException {FileSystemResource fileSystemResource = new FileSystemResource("/Users/huangzaizai/Desktop/huangmingfu/code/spring_resource/src/main/resources/article/res.properties");showPropertiesValue(fileSystemResource.getInputStream(),"fileSystemResource");return fileSystemResource.getInputStream();}private static void inputStreamResource() throws IOException {InputStreamResource inputStreamResource = new InputStreamResource(fileSystemResource());showPropertiesValue(inputStreamResource.getInputStream(),"inputStreamResource");}private static void showPropertiesValue(InputStream stream,String type) throws IOException {Properties properties = new Properties();properties.load(stream);System.out.println(type + ":" + properties.getProperty("textValue"));}
}

2.1 ResourceLoader

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

Resource 接口是用来根据路径来获取资源的。所有的ApplicationContext实现类都实现了这个接口。如果传入带有特定前缀的路径来获取特定类型的资源。或者根据ApplicationContext类型来获取特定类型的资源。例如ClassPathXmlApplicationContext 的getResource 方法如果传入的路径没有特定的前缀,则获取是ClassPathResource资源。

前缀

例子

描述

classpath:

classpath:com/app/config.xml

从类路径加载。

file:

file:///data/config/xml

从系统文件加载,作为URL方式。

http:

https://baidu.com/logo.png

从网络上获取资源。

没有前缀

/data/config.xml

根据ApplicationContext类型来决定获取资源的方式。

表 路径部分前缀

2.2 ResourceLoaderAware 接口

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

当一个bean 实现了这个接口时,可以用来设置ResourceLoader。也可以通过@Autowired 的方式自动注入ResourceLoader 实例。

2.3 作为依赖

Resource的类型的变量可以像其他类型一样被自动注入,在设置值时(value属性),只要设置对应的资源路径即可。

3 ApplicationContext及资源路径

在创建一个ApplicationContext实例时,通常使用资源路径的字符串(或者字符串数组)来作为其构造函数的参数,例如XML配置文件。

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

也可以使用带有特殊前缀资源路径来作为构造函数的参数:

ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:conf/appContext.xml");

3.1 通配符

在使用字符串路径时,可以使用通配符。但是资源一次只指向一个资源。

classpath*:packageName 表示所有能匹配上packageName类路径的资源。

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

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

相关文章

CCF编程能力等级认证GESP—C++2级—20231209

CCF编程能力等级认证GESP—C2级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)小杨做题小杨的 H 字矩阵 参考答案单选题判断题编程题1编程题2 …

C++ STL->list模拟实现

theme: smartblue list list文档 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素…

bpmn-js 事件总线处理

bpmn-js中使用EventBus作为事件的处理句柄,EventBus的使用和我们常规使用的事件总线没啥大的区别,其源码位于:/diagram-js/lib/core/EventBus.js (bpmn-js使用diagram-js实现流程图的web端绘制呈现工具)。 EventBus使用…

代码随想录算法训练营第三二天 | 买卖股票、跳跃游戏

目录 买卖股票的最佳时机II跳跃游戏跳跃游戏ii LeetCode 122.买卖股票的最佳时机II LeetCode 55. 跳跃游戏 LeetCode 45.跳跃游戏II 买卖股票的最佳时机II 只有一只股票! 当前只有买股票或者卖股票的操作。 最终利润是可以分解的:把利润分解为每天为…

变分自编码器(VAE)PyTorch Lightning 实现

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

SAP PP学习笔记- 豆知识02 - 品目要谁来维护?怎么决定更不更新品目的数量金额?

其实都是在品目类型的Customize中设定的。 咱们这里简单试着说一下什么场景使用。 1,SAP中品目有很多View,都要由哪些部门来维护呢? 其实就是谁用谁维护呗。 在新建一个品目的时候,品目Type本身就决定了该品目要由哪些部门来维…

数据结构(4) 链表(链式存储)

链表(链式存储) 单链表定义基本操作的实现单链表的插入按位序插入指定节点的前插指定节点的后插 单链表的删除 小结 单链表 定义 顺序表优点:可随机存取,存储密度高,缺点:要求大片连续空间,改变容量不方便。 单链表优…

高数总结(4

目录 1.总结:小结: 1.总结: 小结: 关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广,搜我的公众号即可:

Codeforces Round 926 F. Sasha and the Wedding Binary Search Tree

F. Sasha and the Wedding Binary Search Tree 题意 给定一颗二叉搜索树,规定树上的所有点的点权都在范围 [ 1 , C ] [1, C] [1,C] 内,树上的某些节点点权已知,某些节点点权未知,求出合法的二叉搜索树的数量 思路 由于是二叉搜…

这应该是全网第一篇全面解读OpenAI Sora报告的文章,精读报告:Video generation models as world simulators

今天是2024年2月16号,大年初七,年还没过完,早晨起来朋友圈就被Sora刷屏了。本来以为没啥,都是公众号或者视屏啥的,都没点开看,直到看到我导也发了Sora的文章,我就知道这个事情不简单了。 先来看…

支付宝沙箱版模拟网站在线完整支付流程(无营业无费用)内网穿透+局域网测试

文章目录 一、介绍1. 支付2. 支付结果 二、前提准备1. 支付宝开放平台2. 内网穿透3. 局域网 三、order微服务1. 依赖、配置2. 工具类1. 二维码生成2. AlipayConfig 3. 端点代码1. /generatepaycode2. /requestpay3. /payresult4. /receivenotify 环境如下 Version手机安卓支付…

红队笔记Day4 -->多层代理(模拟企业拓扑)

声明:本机文章只用于教育用途,无不良引导,禁止用于从事任何违法活动 前几天的红队笔记的网络拓扑都比较简单,今天就来模拟一下企业的真实网络拓扑,以及攻击方法 一般的大企业的网络拓扑如下::…

基于Springboot+Vue实现的宿舍管理系统

基于SpringbootVue的宿舍管理系统 1.系统相关性介绍1.1 系统架构1.2 设计思路 2.功能模块介绍2.1 用户信息模块2.2 宿舍管理模块2.3 信息管理模块 3. 源码获取以及远程部署 前言: 在现代教育环境中,学生宿舍的管理显得尤为重要,需要一套能…

如何在Windows中配置多个显示器?这里提供详细步骤

Windows可以通过多种方式使用多个显示器,扩展或复制主显示器。你甚至可以关闭主显示器。以下是如何使用简单的键盘快捷键更改辅助显示设置。 使用WindowsP投影菜单 要快速更改Windows 10处理多个显示器的方式,请按WindowsP。屏幕右侧会弹出一个名为“投…

图表示学习 Graph Representation Learning chapter1 引言

图表示学习 Graph Representation Learning chapter1 引言 前言1.1图的定义1.1.1多关系图1.1.2特征信息 1.2机器学习在图中的应用1.2.1 节点分类1.2.2 关系预测1.2.3 聚类和组织检测1.2.4 图分类、回归、聚类 前言 虽然我并不研究图神经网络,但是我认为图高效的表示…

电脑重装系统之Windows 10 企业版 LTSC 2021

简介 Windows 10 22H2对于我来说太不简洁,最受不了的一点是微软强行硬塞给我一些并没有什么luan用的应用和功能,比如:天气,Onedrive......以及臃肿的ui设计。而且强行进行自动更新,我是真的受不了这个,看着…

leetcode:343.整数拆分

解题思路: 拆分的越多越好(暂且认为),尽可能拆成m个近似相等的数,会使得乘积最大 dp含义:将i进行拆分得到最大的积为dp[i] 递推公式:j x dp[i-j](固定j,只通过凑dp[i-j]进而实现所…

optee UTA加载

流程 动态TA按照存储位置的不同分为REE filesystem TA:存放在REE侧文件系统里的TA; Early TA:被嵌入到optee os里的在supplicant启动之前就可用了。 这里我们讲的是常规的存放在REE侧文件系统里的TA。 通过GP标准调用的与TA通信的命令(opens…

【AIGC】Stable Diffusion的ControlNet参数入门

Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术,它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释: 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…

Vue的一些基础设置

1.浏览器控制台显示Vue 设置找到扩展,搜索Vue 下载这个 然后 点击扩展按钮 点击详细信息 选择这个,然后重启一下就好了 ——————————————————————————————————————————— 2.优化工程结构 src的components里要…