【第18章】spring-resource

文章目录

  • 前言
  • 一、Resource
    • 1.测试类
    • 2.测试结果
  • 二、ResourceLoader
    • 1.测试类
    • 2.测试结果
  • 三、ResourceLoaderAware
    • 1.实现类
    • 2.配置文件
    • 3.测试类
    • 4.测试结果
    • 5.结论
  • 总结


前言

在Spring框架中,Resource是一个关键组件,它位于org.springframework.core.io包中,用于处理资源的加载和访问。Resource接口为资源提供了一个抽象的表示,这些资源可以是文件、类路径上的资源、URL等。通过这个接口,Spring提供了一种统一的方式来加载和操作这些资源,无论它们实际上存储在哪里。

Resource接口的主要实现类包括:

ClassPathResource:表示类路径下的资源。它使用线程上下文类加载器、给定的类加载器或给定的类来加载资源。例如,你可以通过以下方式创建一个ClassPathResource对象:Resource resource = new ClassPathResource(“test.txt”);

UrlResource:表示一个URL资源。你可以通过URL字符串来创建它,例如:Resource resource = new UrlResource(“https://example.com/resource.txt”);

FileSystemResource:表示文件系统中的资源。Spring提供的这个类用于访问文件系统资源。

要使用Resource接口加载资源,首先需要获取一个ResourceLoader实例,这通常可以通过依赖注入来实现。一旦你有了ResourceLoader,你就可以使用它来加载各种资源。

Resource接口还定义了一系列方法,如exists(), isReadable(), getURL(), getFile()等,这些方法允许你查询资源的状态、获取资源的URL或文件等。

总的来说,Spring的Resource为开发者提供了一种灵活且强大的方式来处理应用程序中的资源。


一、Resource

1.测试类

package org.example.resource;import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.util.ResourceUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** Create by zjg on 2024/4/16*/
public class ResourceTest {public static final String URL_PROTOCOL_HTTPS = "https";public static void main(String[] args) throws IOException {System.out.println("Hello Resource!");//ClassPathResourceString path="jdbc.properties";loadClassPathResource(path);//FileSystemResourcepath="pom.xml";loadFileSystemResource(path);path="G:/workspace/spring6/pom.xml";loadFileSystemResource(path);//UrlResourcepath = "https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif";loadUrlResource(path);}public static void loadClassPathResource(String path) throws IOException {ClassPathResource resource = new ClassPathResource(path);load(resource);}public static void loadFileSystemResource(String path) throws IOException {FileSystemResource resource = new FileSystemResource(path);load(resource);}public static void loadUrlResource(String path) throws IOException {UrlResource resource = new UrlResource(path);load(resource);}public static void load(Resource resource) throws IOException {System.out.println("--------------------------------------");boolean exists = resource.exists();System.out.println(exists);if(exists){System.out.println(resource.getURL());String protocol = resource.getURL().getProtocol();System.out.println(protocol);System.out.println(resource.getFilename());System.out.println(resource.contentLength()+"字节");System.out.println(resource.getDescription());if(resource instanceof ClassPathResource){//打印类路径System.out.println(ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX).getPath());}if(ResourceUtils.URL_PROTOCOL_FILE.equals(protocol)){//打印绝对路径System.out.println(resource.getFile().getAbsolutePath());}if(URL_PROTOCOL_HTTPS.equals(protocol)){//下载到本地download(resource);}}System.out.println("--------------------------------------");}public static void download(Resource source) throws IOException {InputStream inputStream = source.getInputStream();//文件生成到项目根目录下FileOutputStream fileOutputStream = new FileOutputStream(source.getFilename());byte[] bytes=new byte[1024];//1kbint len;while ((len=inputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,len);}}
}

2.测试结果

Hello Resource!
--------------------------------------
true
file:/G:/workspace/spring6/spring-resource/target/classes/jdbc.properties
file
jdbc.properties
234字节
class path resource [jdbc.properties]
G:\workspace\spring6\spring-resource\target\classes
G:\workspace\spring6\spring-resource\target\classes\jdbc.properties
--------------------------------------
--------------------------------------
true
file:/G:/workspace/spring6/pom.xml
file
pom.xml
2601字节
file [G:\workspace\spring6\pom.xml]
G:\workspace\spring6\pom.xml
--------------------------------------
--------------------------------------
true
file:/G:/workspace/spring6/pom.xml
file
pom.xml
2601字节
file [G:\workspace\spring6\pom.xml]
G:\workspace\spring6\pom.xml
--------------------------------------
--------------------------------------
true
https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif
https
dec4d833e4f64eb395567ac1e3746d0a.gif
18658字节
URL [https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif]
--------------------------------------

二、ResourceLoader

ResourceLoader.getResource()得到资源对象,为向上造型,实际对象为其实现类。

1.测试类

package org.example.resource.loader;import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.util.ResourceUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** Create by zjg on 2024/4/17*/
public class ResourceLoaderTest {public static final String URL_PROTOCOL_HTTPS = "https";public static void main(String[] args) throws IOException {System.out.println("Hello ResourceLoader!");DefaultResourceLoader resourceLoader = new DefaultResourceLoader();//加载classpath文件Resource resource = resourceLoader.getResource("classpath:jdbc.properties");load(resource);//加载本地文件resource = resourceLoader.getResource("file:pom.xml");load(resource);resource = resourceLoader.getResource("file:G:\\workspace\\spring6\\pom.xml");load(resource);//加载网络文件resource = resourceLoader.getResource("https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif");load(resource);}public static void load(Resource resource) throws IOException {System.out.println("--------------------------------------");boolean exists = resource.exists();System.out.println(exists);if(exists){System.out.println(resource.getURL());String protocol = resource.getURL().getProtocol();System.out.println(protocol);System.out.println(resource.getFilename());System.out.println(resource.contentLength()+"字节");System.out.println(resource.getDescription());if(resource instanceof ClassPathResource){//打印类路径System.out.println(ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX).getPath());}if(ResourceUtils.URL_PROTOCOL_FILE.equals(protocol)){//打印绝对路径System.out.println(resource.getFile().getAbsolutePath());}if(URL_PROTOCOL_HTTPS.equals(protocol)){//下载到本地download(resource);}}System.out.println("--------------------------------------");}public static void download(Resource source) throws IOException {InputStream inputStream = source.getInputStream();//文件生成到项目根目录下FileOutputStream fileOutputStream = new FileOutputStream(source.getFilename());byte[] bytes=new byte[1024];//1kbint len;while ((len=inputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,len);}}
}

2.测试结果

Hello ResourceLoader!
--------------------------------------
true
file:/G:/workspace/spring6/spring-resource/target/classes/jdbc.properties
file
jdbc.properties
234字节
class path resource [jdbc.properties]
G:\workspace\spring6\spring-resource\target\classes
G:\workspace\spring6\spring-resource\target\classes\jdbc.properties
--------------------------------------
--------------------------------------
true
file:pom.xml
file
pom.xml
2601字节
URL [file:pom.xml]
G:\workspace\spring6\pom.xml
--------------------------------------
--------------------------------------
true
file:G:/workspace/spring6/pom.xml
file
pom.xml
2601字节
URL [file:G:/workspace/spring6/pom.xml]
G:\workspace\spring6\pom.xml
--------------------------------------
--------------------------------------
true
https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif
https
dec4d833e4f64eb395567ac1e3746d0a.gif
18658字节
URL [https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif]
--------------------------------------

三、ResourceLoaderAware

ResourceLoaderAware 接口是 Spring 框架中的一个特性,它允许 bean 在初始化时自动注入一个 ResourceLoader。ResourceLoader 是一个策略接口,用于加载类路径或文件系统上的资源。要使用 ResourceLoaderAware 接口,你需要实现该接口,并在实现中提供一个 setResourceLoader 方法,该方法将由 Spring 容器在 bean 初始化时自动调用。

上面的两种方式都是通过手动new的方式,耦合较强,未通过spring进行管理,下面我们来使用spring容器提供的回调接口来完成对资源的调用。

1.实现类

package org.example.resource.aware;import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.ResourceUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** Create by zjg on 2024/4/17*/
public class DefaultResourceLoaderAware implements ResourceLoaderAware {public static final String URL_PROTOCOL_HTTPS = "https";private ResourceLoader resourceLoader;@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {this.resourceLoader=resourceLoader;System.out.println("this.resourceLoader初始化完成"+this.resourceLoader);}public void getResource(String location) throws IOException {Resource resource = resourceLoader.getResource(location);System.out.println("--------------------------------------");boolean exists = resource.exists();System.out.println(exists);if(exists){System.out.println(resource.getURL());String protocol = resource.getURL().getProtocol();System.out.println(protocol);System.out.println(resource.getFilename());System.out.println(resource.contentLength()+"字节");System.out.println(resource.getDescription());if(resource instanceof ClassPathResource){//打印类路径System.out.println(ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX).getPath());}if(ResourceUtils.URL_PROTOCOL_FILE.equals(protocol)){//打印绝对路径System.out.println(resource.getFile().getAbsolutePath());}if(URL_PROTOCOL_HTTPS.equals(protocol)){//下载到本地download(resource);}}System.out.println("--------------------------------------");}public static void download(Resource source) throws IOException {InputStream inputStream = source.getInputStream();//文件生成到项目根目录下FileOutputStream fileOutputStream = new FileOutputStream(source.getFilename());byte[] bytes=new byte[1024];//1kbint len;while ((len=inputStream.read(bytes))!=-1){fileOutputStream.write(bytes,0,len);}}
}

2.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="defaultResourceLoaderAware" class="org.example.resource.aware.DefaultResourceLoaderAware"></bean>
</beans>

3.测试类

package org.example.resource.aware;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import java.io.IOException;/*** Create by zjg on 2024/4/17*/
@SpringJUnitConfig(locations = "classpath:springContext.xml")
public class ResourceLoaderAwareTest {@AutowiredDefaultResourceLoaderAware resourceLoaderAware;@org.junit.jupiter.api.Testpublic void test() throws IOException {//加载classpath文件resourceLoaderAware.getResource("classpath:jdbc.properties");//加载本地文件resourceLoaderAware.getResource("file:pom.xml");resourceLoaderAware.getResource("file:G:\\workspace\\spring6\\pom.xml");//加载网络文件resourceLoaderAware.getResource("https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif");}
}

4.测试结果

this.resourceLoader初始化完成org.springframework.context.support.GenericApplicationContext@51549490, started on Wed Apr 17 22:25:17 CST 2024
--------------------------------------
true
file:/G:/workspace/spring6/spring-resource/target/classes/jdbc.properties
file
jdbc.properties
234字节
class path resource [jdbc.properties]
G:\workspace\spring6\spring-resource\target\classes
G:\workspace\spring6\spring-resource\target\classes\jdbc.properties
--------------------------------------
--------------------------------------
true
file:pom.xml
file
pom.xml
732字节
URL [file:pom.xml]
G:\workspace\spring6\spring-resource\pom.xml
--------------------------------------
--------------------------------------
true
file:G:/workspace/spring6/pom.xml
file
pom.xml
2601字节
URL [file:G:/workspace/spring6/pom.xml]
G:\workspace\spring6\pom.xml
--------------------------------------
--------------------------------------
true
https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif
https
dec4d833e4f64eb395567ac1e3746d0a.gif
18658字节
URL [https://img-blog.csdnimg.cn/direct/dec4d833e4f64eb395567ac1e3746d0a.gif]
--------------------------------------

5.结论

在这里插入图片描述

可以看到,spring帮我们注入了一个上下文GenericApplicationContext,这个上下文的父类实现了ResourceLoader接口,在测试类中,我们所做的只有对DefaultResourceLoaderAware的方法调用,大大减少了调用时的代码量,也不用再去new各种对象了。


总结

回到顶部

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

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

相关文章

【深度学习】DDoS-Detection-Challenge aitrans2024 入侵检测,基于机器学习(深度学习)判断网络入侵

当了次教练&#xff0c;做了个比赛的Stage1&#xff0c;https://github.com/AItransCompetition/DDoS-Detection-Challenge&#xff0c;得了100分。 一些记录&#xff1a; 1、提交的flowid不能重复&#xff0c;提交的是非入侵的数量和数据flowid,看check.cpp可知。 2、Stage…

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

CSS的网页美化功能

<1>文字类 通常情况下&#xff0c;一般使用span对文字进行重点突出&#xff0c;用div来操作一段代码块。 字体的所有属性&#xff1a; 属性描述font在一个声明中设置所有的字体属性font-family指定文本的字体系列font-size指定文本的字体大小font-style指定文本的字体样…

route-policy和ACL、ip-prefix组合时permit和deny的作用

route-policy配置实例 (1)route-policy为permit&#xff0c;ACL有permit也有deny(2)route-policy为permit&#xff0c;ACL有permit也有deny(3)route-policy为deny&#xff0c;ACL有permit也有deny(4)route-policy为deny&#xff0c;ACL也为deny(5)route-policy为deny&#xff0…

智慧文旅:引领旅游产业智慧升级的创新模式

一、智慧文旅是什么&#xff1f; 智慧文旅是指以当地特色文化为核心&#xff0c;借助现代科技手段&#xff0c;实现旅游景区全面智慧升级的旅游模式。在智慧文旅中&#xff0c;新一代信息网络技术和装备得到充分运用&#xff0c;文化旅游基础设施得到新建和改善&#xff0c;特…

基于FPGA轻松玩转AI

启动人工智能应用从来没有像现在这样容易&#xff01;受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA&#xff0c;AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用&#xff0c;因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…

目标检测——YOLOv6算法解读

论文&#xff1a;YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者&#xff1a;Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

树莓派驱动开发----iic驱动oled屏幕篇

水一期吧&#xff0c;上效果 有点模糊&#xff0c;我直接说吧&#xff0c;修改设备树&#xff0c;iic1&#xff0c;地址0x3c&#xff0c;然后编写驱动文件&#xff0c;app文件&#xff0c;挂载驱动模块后在终端输入 /*******************************************************…

【动态规划】C++ 子序列问题(递增子序列、数对链、定差子序列、斐波那契子序列...)

文章目录 1. 前言2. 例题最长递增子序列 3. 算法题3.1_摆动序列3.2_最长递增子序列的个数3.3_最长数对链[3.4_ 最长定差子序列](https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/description/)3.5_最长的斐波那契子序列的长度3.6_最长等差数…

Spring Boot:Web应用开发之增删改查的实现

Spring Boot 前言实现增删改查功能 前言 增删改查功能作为 Web 应用中的基础且重要的组成部分&#xff0c;是基本的数据库操作&#xff0c;也是实现业务逻辑和功能的关键要素。下面简单介绍使用 Spring Boot 实现增删改查的功能。 实现增删改查功能 在上一章 Spring Boot&am…

安装无法完成。安装Autodesk产品时出现错误103

解决方法如下 打开autoremove&#xff0c;点击扩展功能&#xff0c;输入103&#xff0c;点击搜索 注意 修复过程根据情况可能会很慢 等待提示修复成功&#xff0c;再尝试重新安装软件。 软件每周六选择其他方式登录免费使用

海康Visionmaster-常见问题排查方法-启动失数

问题2&#xff1a;VM无法启动&#xff0c;报错&#xff1a;参数错误&#xff1b;  问题原因&#xff1a;客户电脑环境异常导致代理启动失败。  解决方法&#xff1a;安装运行时库&#xff0c;并测试代理能否正常启动,步骤如下&#xff1a; ① 尝试双击代理进程&#xff…

Linux之yum和vim的使用

一、yum的使用 yum 后面跟install要安装的文件名&#xff1a; 若你要安装的文件已经存在&#xff0c;则会出现&#xff1a; 要删除文件&#xff1a; yum remore文件名即可删除 在我们安装完lrzsz之后&#xff0c;可以用rz指令和sz指令&#xff1a; rz指令可以从window窗口中…

【Linux开发实用篇】Webmin和宝塔

可视化工具 Webmin宝塔 Webmin Webmin是功能强大的基于Web的Linux/Unix管理工具 下载地址&#xff1a;http://download.webmin.com/download/yum/ 使用wget指令下载&#xff1a;http://download.webmin.com/download/yum/webmin-1.700-1.noarch.rpm 然后进行安装&#xff1a; …

第07-5章 传输层详解

7.1 传输层概述 分段及封装应用层送来的数据&#xff1a;应用层以字节流的形式给传输层传输数据&#xff0c;传输层会把字节流分段&#xff0c;并给每段封装 由应用程序产生应用进程&#xff0c;由应用进程产生进程端口号&#xff0c;由端口号提供相应的服务 如何查看本…

项目实践---贪吃蛇小游戏(下)

对于贪吃蛇小游戏&#xff0c;最主要的还是主函数部分&#xff0c;这里就和大家一一列举出来&#xff0c;上一章已经写过头文件了&#xff0c;这里就不多介绍了。 首先就是打印桌面&#xff0c;也就是背景&#xff0c;则对应的代码为&#xff1a; void SetPos(short x, short …

(四)Servlet教程——Maven的安装与配置

1.在C盘根目录下新建一个Java文件夹,该文件夹用来放置以下步骤下载的Maven&#xff1b; 2. 下载Maven的来源有清华大学开源软件镜像站和Apache Maven的官网&#xff0c;由于清华大学开源软件镜像站上只能下载3.8.8版本以上的Maven&#xff0c;我们选择在Apache Maven的官网上下…

VulnHub靶机 DC-8 打靶实战 详细渗透过程

VulnHub靶机 DC-8 打靶 详细渗透过程 目录 VulnHub靶机 DC-8 打靶 详细渗透过程一、将靶机配置导入到虚拟机当中二、渗透测试流程主机发现端口扫描Web渗透SQL注入登录后台反弹shell提权 一、将靶机配置导入到虚拟机当中 靶机地址&#xff1a; https://www.vulnhub.com/entry/…

Docker容器概念介绍与基本管理

前言 在软件开发和部署环境中&#xff0c;使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署&#xff0c;提高开发效率和应用程序的可移植性。 目录 一、虚拟化产品介绍 1. 云服务模型 1.1 IaaS 1.2 PaaS 1.3 SaaS 1.4 DaaS 2. 产品介绍 2.1 虚…