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类路径的资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(上)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络,也称为多层感知机(Multilayer Perceptron,MLP),是一种常见的神经网络模型,用于解决各种机器学习问题,包括分类和回归。BP 代表“反向传播”(Backpropagation&#…

使用redis-insight连接到服务器上的redis数据库

一、安装redis: 安装 Redis。你可以通过运行下面的命令来使用 yum 安装 Redis: sudo yum install redis 启动 Redis 服务。安装完成后,你可以通过运行下面的命令来启动 Redis 服务: sudo systemctl start redis 设置 Redis 服务…

【C++】static静态关键字

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换 将十进制数转换为二进制表示形式的最简单方法是“除二法”&#xff0c;可用栈来跟踪二进制结果。 除二法 下面实现一个将十进制数转换为二进制或十六进制的算法&#xff0c;代码如下&#xff1a; #[derive(Debug)] struct Stack<T> {size: usize, // 栈大…

【机器学习笔记】5 机器学习实践

数据集划分 子集划分 训练集&#xff08;Training Set&#xff09;&#xff1a;帮助我们训练模型&#xff0c;简单的说就是通过训练集的数据让我们确定拟合曲线的参数。 验证集&#xff08;Validation Set&#xff09;&#xff1a;也叫做开发集&#xff08; Dev Set &#xf…

【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章主要是为了解答有…

LeetCode Python -18.四数之和

目录 题目答案运行结果 题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#x…

OpenTitan- 开源安全芯片横空出世

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

前端网络安全笔记

本文主要涉及6个内容&#xff1a; HTTP与HTTPS同源策略&#xff08;Same-origin policy&#xff0c;简称 SOP&#xff09;/ 跨域资源共享&#xff08;Cross-Origin Resource Sharing&#xff0c;简称 CORS&#xff09;跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0…

Java中的String类的常用方法(对于字符串的常用操作)

目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组 七、比较字符串的内容是否相等 八、连接字符串 九、比较两个字符串的大…

JVM(5)面试篇

1 什么是JVM&#xff1f; 关联课程内容 基础篇-初识JVM基础篇-Java虚拟机的组成 回答路径 JVM的定义作用功能组成 1、定义&#xff1a; JVM 指的是Java虚拟机&#xff08; Java Virtual Machine &#xff09;。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是…

ArduPilot开源飞控之硬件SBC分析

ArduPilot开源飞控之硬件SBC分析 1. 源由2. Companion Computer2.1 APSync【不推荐&#xff0c;无更新】2.2 DroneKit【不推荐&#xff0c;无更新/SDK】2.3 FlytOS【不推荐&#xff0c;闭源】2.4 Maverick【不推荐&#xff0c;闭源】2.5 ROS【专门讨论&#xff0c;开源/复杂】2…

C/C++重点解析——内存管理

1. C/C内存分布 我们先来看一段代码和其相关问题&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd"…

HGAME2024 WEEK2 wp webmisc

web What the cow say? 进入容器有个输入框&#xff0c;尝试ssti、命令执行、代码执行等&#xff0c;最后发现可使用反引号执行命令&#xff1b; 输入 nl app.py 可查看源代码&#xff0c;有功能具体实现、过滤之类的&#xff1b; flag在 /flag_is_here home/flag_c0w54y 中…

【NLP】MHA、MQA、GQA机制的区别

Note LLama2的注意力机制使用了GQA。三种机制的图如下&#xff1a; MHA机制&#xff08;Multi-head Attention&#xff09; MHA&#xff08;Multi-head Attention&#xff09;是标准的多头注意力机制&#xff0c;包含h个Query、Key 和 Value 矩阵。所有注意力头的 Key 和 V…

AI中的直方图均衡

目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是图像直方图以及它为什么有用使用 OpenCV 函数 cv&#xff1a;&#xff1a;equalizeHist 均衡图像的直方图 理论 什么是图像直方图&#xff1f; 它是图像强度分布的图形表示。它量化了所考虑的每个强度值的像素数。…

搜索专项---最短路模型

文章目录 迷宫问题武士风度的牛抓住那头牛 一、迷宫问题OJ链接 本题思路:只需要记录各个点是有哪个点走过来的&#xff0c;就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1&#xff0c;则将2,1这个点的前驱记为1,1。这样&#xff0c;将整张地图 bfs 后&#xff0c…

[嵌入式系统-14]:常见实时嵌入式操作系统比较:RT-Thread、uC/OS-II和FreeRTOS、Linux

目录 一、实时嵌入式操作系统 1.1 概述 1.2 什么“实时” 1.3 什么是硬实时和软实时 1.4 什么是嵌入式 1.5 什么操作系统 二、常见重量级操作系统 三、常见轻量级嵌入式操作系统 3.1 概述 3.2 FreeRTOS 3.3 uC/OS-II 3.4 RT-Thread 3.5 RT-Thread、uC/OS-II、Free…

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…