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.hqwc.cn/news/473592.html

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

相关文章

2024年2月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

09:资源利用率监控|存储卷管理

资源利用率监控|存储卷管理 资源利用率监控开启聚合服务安装metrics-server监控容器利用率 存储卷管理临时卷ConfigMap卷 存配置文件emptyDir卷 适合缓存 持久卷hostPath 卷 NFS共享卷持久卷搭建NFS服务器创建PV创建PVC 资源利用率监控 开启聚合服务 kubelet证书 在…

Excel如何把窗口冻结,在下拉滚动条的时候仍然可以看到前几行数据?

** 共分2个情况: ①: 冻结首行: 作用:只冻结第一行的数据窗口。在下拉滚动条时,首行不会动,其他数据行会动步骤如下:1、鼠标放在首行的最左边,然后左键点一下先选中整行2、然后&am…

QtApplets-线程池

QtApplets-线程池 ​ 今天咱们稍微看下Qt的线程池。QThreadPool,浅浅搞一下。 文章目录 QtApplets-线程池QThreadPoolQThreadPool 与 QThread 区别替代方案Qt Concurrent QThreadPool 与 Qt Concurrent 区别Demo运行效果 ☞ 源码 关键字: Qt、QRunnable…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(6)特征工程初步

特征工程是一个非常重要的概念,从特征工程可以领会到机器学习的真谛。 特征工程就是从原始数据转换为特征向量的过程。 特征工程的特点: 特征工程是机器学习中很重要的起始步骤,直接影响效果,需要大量的时间。 数据和特征决定了…

究极小白如何自己搭建一个自动发卡网站-独角数卡

本人从来没接触过建站,我之前都是在TB上花90叫别人给我搭建的网站,前几天这个TB店倒闭跑路了,而我的发卡网也打不开了,没办法,逼上梁山,自己捣鼓出来了!下面是2023/4/2自己建好的! …

【IO流】FileOutputStream 字节输出流

FileOutputStream 字节输出流 1. 概述2. 作用3. 书写步骤4. 构造方法5. 换行写6. 续写7. 注意事项 1. 概述 FileOutputStream 是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流,该流用于将数据写入文件。 功能:FileOutputStream …

RocketMQ快速入门: linux安装RocketMQ并配置开机自启

0. 引言 针对rocketMQ的学习,首当其冲的就是正确安装服务,所以我们今天来看linux下如何安装rocketmq及其控制台服务,并设置各个服务的开机自启 1. 安装 因为rocketmq是基于java的,所以需要大家提前安装好java环境,这…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

EasyUI动态加载组件

要实现如下的效果,在表格中显示进度条 主要是需要再次初始化组件,借用ChatGPT的意思是: 在许多 JavaScript UI 框架中,包括 EasyUI,在动态地创建或插入新的 DOM 元素后,通常需要手动初始化相关的组件或特性…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法,目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值,根据比较结果来确定每个像素点的状态(前景或背景)。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…