Spring Resource

news2024/12/25 23:40:25

 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.coloradmin.cn/o/1452045.html

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

相关文章

7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

表达式和语句的区别 表达式就是可以被求值的代码比如什么a 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 分支语句 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码,让计算机有条件…

MATLAB知识点:nchoosek函数(★★★☆☆)用来计算组合数,也能返回从向量v中抽取k个元素的所有组合

讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第三…

鸿蒙系统优缺点,能否作为开发者选择

凡是都有对立面,就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点: 鸿蒙是从2019年开始做出来的,那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统,套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙,但是它的…

云计算基础-云计算概念

云计算定义 云计算是一种基于互联网的计算方式,通过这种计算方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。云计算依赖资源共享以达成规模经济,类似基础设置(如电力网)。 云计算最基本的概念就是云加端,我们有一个…

机器学习面试:请你谈谈逻辑回归的用法?

逻辑回归可用于以下几个方面: (1)用于概率预测。用于可能性预测时,得到的结果有可比性。比如根据模型进而预测在不同的自变量情况下,发生某病或某种情况的概率有多大。 (2)用于分类。实际上跟预测有些类似,也是根据模型,判断某人属…

代码随想录第32天|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

文章目录 买卖股票思路一:贪心代码: 思路:动态规划代码: 跳跃游戏思路:贪心找最大范围代码: 跳跃游戏②思路:代码: 方法二:处理方法一的特殊情况 买卖股票 思路一&#x…

macOS 安装 conda

macOS 安装 conda 安装 conda参考 Conda是一个开源的软件包管理系统和环境管理系统,用于安装和管理软件包和其依赖项。 安装 conda mkdir miniconda3 cd miniconda3 bash Miniconda3-latest-MacOSX-x86_64.sh$ conda list参考 macOS 安装 conda开始使用conda

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…

[Java][算法 滑动窗口]Day 03---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

人力资源智能化管理项目(day09:权限应用)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 搭建页面结构 <template><div class"container"><div class"app-container"><el-button class"btn-add" type"p…

Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库 AGP 8. 根目录的 settings.gradle dependencyResolutionManagement {...repositories {...maven { url https://jitpack.io }} } AGP 8. 根目录如果是 settings.gradle.kts 文件 dependencyResolutionManagement {...repositories {...…

【每日一题】06 排序链表

问题描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 求解 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* sortList(struct ListNode* head) {struct…

【STM32 CubeMX】串口编程DMA+IDLE中断

文章目录 前言一、为什么要引入IDLE中断二、IDLE中断使用方式2.1 接收的三种情况2.2 函数的使用查询方式中断方式DMA方式分析一个问题 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项关键的任务&#xff0c;而使用DMA&#xff08;直接内存访问&#xff09;结合IDLE中断进…

【JavaSE】数据类型和运算符

目录​​​​​​​ 前言 数据类型 1. 数据类型的分类 2. 基本数据类型 变量 1. 概叙 2. 整型变量 3. 字节型 & 短整型 & 长整型变量 4. 单 / 双精度浮点型变量 5. 字符型变量 6. 布尔型变量 类型转换 1. 自动类型转换(隐式) 2. 强制类型转换(显式) 补…

针对某终端安全自检钓鱼工具的分析

前言 朋友微信找到我&#xff0c;说某微信群利用0day通告进行钓鱼&#xff0c;传播名为“终端安全自检工具”的恶意文件&#xff0c;然后还给了两个IP地址&#xff0c;如下&#xff1a; 咱们就来详细看看这个工具吧。 样本信息 拿到样本&#xff0c;样本的图标&#xff0c;如…

[嵌入式系统-16]:RT-Thread -2- 主要功能功能组件详解与API函数说明

目录 一、RT-Thread主要功能组件 二、内核组件 2.1 概述 2.2 API 三、设备驱动 3.1 概述 3.2 API 四、通信组件 4.1 概述 4.4 API 五、网络组件 5.1 概述 5.2 API 5.3 补充&#xff1a;MQTT协议 六、文件系统 6.1 概述 6.2 API 七、GUI 组件 7.1 概述 7.2 …

LabVIEW卫星电视接收仿真系统

LabVIEW卫星电视接收仿真系统 随着卫星电视数字化的加速&#xff0c;传统模拟信号接收系统已无法满足需求。设计一套船载数字卫星电视接收系统&#xff0c;通过LabVIEW环境进行仿真实验&#xff0c;验证系统设计的可行性与有效性&#xff0c;满足数字信号接收的高精度要求&…

【从Python基础到深度学习】2. Ubuntu及插件安装

本期所有软件安装包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1UVEYm-12FivAnrE5NUXevg?pwdum60 一、安装Ubuntu 1.1 软件安装包&#xff1a;下载 VMware Workstation Pro | CN 一直点下一步即可 1.2 双击运行软件&#xff1a; 输入密钥 1 、VMware 15密钥 …

【数据结构】16 二叉树的定义,性质,存储结构(以及先序、后序、中序遍历)

二叉树 一个二叉树是一个有穷的结点集合。 它是由根节点和称为其左子树和右子树的两个不相交的二叉树组成的。 二叉树可具有以下5种形态。 性质 一个二叉树第i层的最大结点数为 2 i − 1 2^{i-1} 2i−1, i ≥ 1 i \geq 1 i≥1 每层最大结点可以对应完美二叉树&#xff08;…

[ai笔记9] openAI Sora技术文档引用文献汇总

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第9篇分享&#xff01; 这篇笔记承接上一篇技术文档的学习&#xff0c;主要是为了做一个记录&#xff0c;记录下openai sora技术介绍文档提到的一些论文&#xff0c;再此特地记录一下&#xff01; 1 原文…