一起学SF框架系列6.1-模块core-Resource

news2024/9/21 4:40:52

  Java虽然提供了java.net.URL类和各种URL前缀处理程序来负责处理对各种资源的访问,但对于低级别资源的访问来说还是不够充分。例如,没有标准化的实现可用于访问需要从类路径中获取或者相对于一个ServletContext的资源;也没有检查所指向的资源是否存在的标准方法。因此Spring提供了Resource来达成目的。

类作用

  Resource是Spring的资源抽象,本质上是JDKjava.net.URL类的一个功能更丰富的版本。Resource可以以透明的方式从几乎任何位置获得低级资源,包括从类路径、文件系统位置、可以用标准URL描述的任何位置以及其他一些变体。如果资源位置字符串是一个没有任何特殊前缀的简单路径,那么这些资源的来源是特定的,并且适合于实际的应用程序容器类型。
  Spring本身广泛使用Resource,其实应用容器(ApplicationContext)本身就是个ResourceLoader,可用于加载Resource对象。提供给ApplicationContext构造函数的一个或多个位置路径实际上是资源字符串,并且以简单的形式根据特定的容器实现进行适当处理。例如,ClassPathXmlApplicationContext将简单的位置路径视为类路径位置。您还可以使用带有特殊前缀的位置路径(资源字符串)来强制从类路径或URL加载定义,而不考虑实际的容器类型。
  虽然Spring本身使用Resource接口很多,但它实际上是一个非常方便的通用实用程序类,用于在自己的代码中访问资源,即使你的代码不知道或关心Spring的任何其他部分。虽然这会使你的代码与Spring耦合,但它只会将其与这个小集合的实用程序类耦合,这些实用程序类可以作为URL的更强大的替代品,并且可以被认为是用于此目的的任何其他库的等效物。
Resource主要关注安全可靠的读取资源,其方法如下:

public interface Resource extends InputStreamSource {
	//资源是否以物理形式存在
	boolean exists();
	
	boolean isReadable();
	//资源是否已打开
	boolean isOpen();

	boolean isFile();

	URL getURL() throws IOException;

	URI getURI() throws IOException;

	File getFile() throws IOException;

	ReadableByteChannel readableChannel() throws IOException;

	long contentLength() throws IOException;

	long lastModified() throws IOException;

	Resource createRelative(String relativePath) throws IOException;

	String getFilename();
	//返回资源描述,通常是文件全路径名或完整的URL
	String getDescription();
}
//父接口
public interface InputStreamSource {
	//定位并打开资源,返回输入流
	InputStream getInputStream() throws IOException;
}

实际上,Resource本身作为一个通用工具类,在我们的应用代码中可直接使用,可以非常方便访问资源。
注:由于Resource主要就是用于访问资源,因此只有读取相关的方法,没有修改/写入的方法。针对有修改需求的资源,通过子类接口WritableResource提供。

类关系图

基于Resource的目的,spring构建按了整个Resource实现的体系,其类关系图如下:
在这里插入图片描述

1、Resouce继承了InputStreamSource,通过来源getInputStream()统一转换为输入流InputStream,以便访问。
2、AbstractResource是Resource的基础实现,除了getInputStream由子类实现外,其它资源的访问等典型行为均统一实现了。
3、AbstractResource的子孙类就是各种具体资源的实现,包括:
AbstractFileResolvingResource:实现对URL/URI类资源访问
  UrlResource:实现java.net.URL定位的资源访问,支持"file:"协议
    FileUrlResource:是在UrlResource基础上增加修改资源能力
  ClassPathResource:实现通过classpath寻址的资源访问
FileSystemResource:实现java.io.File或java.nio.file.Path定位的资源访问
ByteArrayResource:实现来自ByteArray的资源访问
InputStreamResource:实现来自InputStream的资源访问
PathResource:实现java.nio.file.Path定位的资源访问
VfsResource:实现基于JBoss VFS定位的资源访问
4、WritableResource是增加Resource可写入能力,支持的类包括:FileUrlResource、FileSystemResource、PathResource。

类实现

UrlResource

UrlResource针对来自java.net.URL类资源的对象,如文件、HTTPS目标、FTP目标等。所有URL都是一个标准化的字符串,一般通过标准化前缀来指示URL类型。标准化前缀包括:"file:"表示通过文件系统路径访问资源;“https:"或“http:"表示通过https/http协议访问资源;”ftp:“表示通过ftp协议访问资源等。

ClassPathResource

ClassPathResource类表示从类路径(ClassPath)获得的资源。

FileSystemResource

FileSystemResource是针对访问java.io.File句柄或java.nio.file.Path句柄资源的Resource实现。
java.nio.path.path句柄资源的访问见PathResource。
FileSystemResource的资源路径总是相对于应用根目录,无论第一个字符是否有”/",如下面两个语句是等效的:

ApplicationContext ctx =
	new FileSystemXmlApplicationContext("conf/context.xml");

ApplicationContext ctx =
	new FileSystemXmlApplicationContext("/conf/context.xml");

PathResource

PathResource是针对访问java.nio.file.Path句柄的Resource实现,通过Path API执行所有操作和转换。它支持解析为文件和URL,还实现了扩展的WritableResource接口。
PathResource实际上是FileSystemResource的纯java.nio.path.path替代方案。

ServletContextResource

ServletContextResource是针对访问ServletContext资源的Resource实现,用于相关web应用程序根目录中的相对路径。

InputStreamResource

InputStreamResource是针对访问已打开的InputStream的Resource实现。

ByteArrayResource

ByteArrayResource是把一个给定字节数组当作资源访问的Resource实现。它为给定的字节数组创建一个ByteArrayInputStream。

资源加载

资源加载器

Resource只管负责资源访问,资源如何加载进来就要靠加载类完成。
资源加载器是个统一接口:

public interface ResourceLoader {

	Resource getResource(String location);

	ClassLoader getClassLoader();
}

ResourceLoader实现类关系图如下:
在这里插入图片描述
ResourceLoader:通用加载资源接口。
DefaultResourceLoader:通用资源加载实现(阅读下getResource(String location)实现)。有特殊加载方式通过子类实现,包括:ClassRelativeResourceLoader、FileSystemResourceLoader。
所有类型的应用容器都实现了ResourceLoader。

ResourcePatternResolver-路径通配符处理

ResourcePatternResolver接口是ResourceLoader接口的扩展,该接口定义了把包含"classpath*:"或Ant正则表达式通配符的资源位置下的所有资源解析为Resource对象。
1、"classpath*:"表示类路径下所有目录或jar包中,与给定名称匹配的类路径资源都进行加载。
2、Ant正则表达式通配符有三种:
  ? :匹配任何单字符
  * :匹配0或者任意数量的字符
  **:匹配0或者更多的目录
ResourcePatternResolver接口如下:

public interface ResourcePatternResolver extends ResourceLoader {

	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

	Resource[] getResources(String locationPattern) throws IOException;
}

PathMatchingResourcePatternResolver是接口ResourcePatternSolver的独立实现,可脱离容器之外使用。
任何标准ApplicationContext中的默认ResourceLoader实际上都是PathMatchingResourcePatternResolver的一个实例。

应用访问资源

直接获取使用

引用程序可利用Resource获得使用资源的能力。举例代码如下:

/*依据ctx的容器类型加载资源,并返回适当的Resource对象
ClassPathXmlApplicationContext:返回ClassPathResource
FileSystemXmlApplicationContext:返回FileSystemResource
WebApplicationContext:返回ServletContextResource
*/
Resource res= ctx.getResource("some/resource/path/myTemplate.txt");

//在classpath下查找资源并加载 
Resource res= ctx.getResource("classpath:some/resource/path/myTemplate.txt");

//以URL方式(file协议)加载资源
Resource res= ctx.getResource("file:///some/resource/path/myTemplate.txt");

//以URL方式(https协议)加载资源
Resource res= ctx.getResource("https://myhost.com/resource/path/myTemplate.txt");

Aware方式获取

要使用资源的应用类实现ResourceLoaderAware接口,应用启动过程中,SF会自动把ResourceLoader接入到到应用类。代码如下:

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

//应用
public class TestResource implements ResourceLoaderAware {
	private ResourceLoader  resourceLoader ;
	void setResourceLoader(ResourceLoader resourceLoader){
		this.resourceLoader  = resourceLoader ;
	}
	...
}

应用类也可以实现ApplicationContextAware,因为ApplicationContext就是本身的祖先类就是ResourceLoader。

静态资源bean

如果bean本身将通过某种动态过程来确定和提供资源。如果bean是动态资源(如考虑加载某种类型的模板,其中所需的特定资源取决于用户的角色),可使用ResourceLoader或ResourcePatternResolver接口加载资源。如果资源是静态的,可完全消除对ResourceLoader接口(或ResourcePatternResolver接口)的使用,可通过bean配置直接注入,而且可多种方式。举例如下:
注入方式1:

public class MyBean {

	private Resource resource;

	public setResource(Resource resource) {
		this.resource= resource;
	}

	// ...
}

配置如下:

<bean id="myBean" class="example.MyBean">
	<property name="resource" value="some/resource/path/myResource.txt"/>
</bean>

注入方式2:

@Component
public class MyBean {

	private final Resource[] resources;
	//resources.path是在应用属性文件中配置的
	public MyBean(@Value("${resources.path}") Resource[] resources) {
		this.resources= resources;
	}
	// ...
}

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

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

相关文章

火影手游 问答题小抄

文章目录 Part.I IntroductionPart.II 一些常识Chap.I 基础常识Chap.II 人物相关Chap.III 原作相关Chap.III 游戏相关 Part.III 奥义 & 技能Chap.I S 忍Chap.II A 忍Chap.III B 忍Chap.IV C 忍 Part.IV 针对活动Chap.I 组织樱花祭Chap.II 樱花问答 Pary.V 名言Reference Pa…

群辉DSM7.2安装svn服务

Part1前言 今天研究了一晚上使用群辉安装svn&#xff0c;确实挺多坑的&#xff0c;总结记录一下。我的型号是DS220&#xff0c;版本为DSM 7.2 Part2安装docker 首先打开套件中心&#xff0c;如下图&#xff0c;检索docker 然后点击安装&#xff0c;安装之后打开如下&#xff1a…

Clickhouse之物化视图分享

前言 ClickHouse广泛用于用户和系统日志查询场景中&#xff0c;主要针对于OLAP场景&#xff0c;为业务方提供稳定高效的查询服务。在业务场景下&#xff0c;数据以不同的格式、途径写入到clickhouse。用传统JOIN方式查询海量数据&#xff0c;通常有如下痛点: 每个查询的代码冗…

【TOP生物信息】基于Scanpy的单细胞数据质控、聚类、标注

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 「写在前面」 Python作为一种高级编程语言&#xff0c;被广泛用于单细胞数据分析&#xff0c;有着以下的优势&#xff1a; 「大量的生物信息学库&#xff1a;」 Python拥有大量的…

【UE 从零开始制作坦克】6-坦克开炮

效果 步骤 1. 添加初学者内容包&#xff08;需要用到其中的音效和粒子效果&#xff09; 2. 接下来制作坦克的炮弹 首先新建一个Actor蓝图类&#xff0c;作为所有发射物体&#xff08;炮弹、机枪子弹等&#xff09;的父类&#xff0c;这里命名为“TotalCategoryOfProjectile”…

从清华高材生拿到百万年薪offer说起

这几天在脉脉上看到一个很火的帖子&#xff0c;帖子内容是一位清华姚班毕业的博士&#xff0c;透露其拿到「亚马逊应用科学家」的offer&#xff0c;Base 110k/月&#xff0b;股票400K分四年给&#xff0c;还有195k的签字费。 清华姚班毕业薪资 看到这张截图博主留下了羡慕的泪…

搞懂了,React 中原来要这样测试自定义 Hooks

React 中自定义的 Hooks 为开发者提供了重用公共方法的能力。然而&#xff0c;如果你是一个测试新手的话&#xff0c;测试这些钩子可能会很棘手。本文中&#xff0c;我们将探索如何使用 React Testing Library 测试库来测试自定义钩子。 如何测试 React 组件 开始前&#xff…

【统计模型】生存分析基本知识介绍

目录 一、生存分析介绍 1.生存分析用途 2.传统方法在分析随访资料时的困难 &#xff08;1&#xff09;生存时间和生存结局都是我们关心的因素 &#xff08;2&#xff09;存在大量失访 &#xff08;3&#xff09;显然&#xff0c;将失访数据无论是算作死亡还是存活都不合理…

CSS基础学习--20 提示工具(Tooltip)

一、定义 提示工具在鼠标移动到指定元素后触发&#xff0c;总共四种样式实例&#xff1a; 二、基础提示框(Tooltip) 提示框在鼠标移动到指定元素上显示 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>CSS基础学习-提…

【RV1126】IIC驱动--EEPROM

文章目录 原理图查找空闲的I2CEEPROM芯片改设备树编写驱动驱动端设备端驱动端和设备端编译成驱动模块应用层的测试代码 原理图查找空闲的I2C 由上面可以知道&#xff0c;空闲了I2C4接口&#xff0c;然后也引出来了。 再找原理图找到具体引脚&#xff1a; I2C4_SCL&#xff1…

第 5 章 机器学习技术的应用(下)

全文目录 机器学习技术的实施方法 预测阶段效果监控 离线预测在线预测 监控点击率的稳定性 真实点击率的稳定性 计算相邻两个区间内点击率分布的 PSI(Population Stability Index, 群体稳定性指标), 小于 0.1 可认为数据相对稳定;预测点击率的稳定性 与系统本身和用户发生变…

Dice Loss

导读 ​ Dice Loss是由 Dice 系数而得名的&#xff0c;Dice系数是一种用于评估两个样本相似性的度量函数&#xff0c;其值越大意味着这两个样本越相似&#xff0c;Dice系数的数学表达式如下&#xff1a; Dice 2 ∣ X ∩ Y ∣ ∣ X ∣ ∣ Y ∣ \text { Dice }\frac{2|X \ca…

Windows10完全卸载oracle19c

Windows10完全卸载oracle19c 1.停止服务2.卸载产品3.清理注册表4.清理环境变量5.清理文件夹 1.停止服务 winR输入service.msc进入服务列表&#xff0c;停止所有的服务 2.卸载产品 点击开始菜找到Oracle&#xff0c;然后点击Oracle安装产品&#xff0c;再点击Universal Inst…

如何安装PHP框架

目录 什么是PHP框架 第一步 安装PHP依赖包 第二步 导入PHP相关包 第三步 解包并切换进指定目录 第四步 在PHP目录内编译安装 第五步 编译 第六步 拷贝配置文件进行编辑 第七步 修改时区 第八步 修改文件指定路径 第九步 将命令加入指定目录进行识别 第十步 进入配置…

【Flutter】Audioplayers 4.1.0 简要使用说明

文章目录 一、前言二、安装和设置三、基本使用1.创建 AudioPlayer 实例2.设置音频源3.控制播放 四、示例代码五、总结 一、前言 Audioplayers 是一个非常实用的 Flutter 插件&#xff0c;它可以帮助我们在 Flutter 应用中播放音频。无论你是想在你的应用中添加背景音乐&#x…

【Python】在同一图形中更加优雅地绘制多个子图

1. 引言 数据可视化非常重要&#xff0c;有一句俗语叫做一图顶千言&#xff0c;我相信好多小伙伴应该都听说过这句话&#xff1b;即使是有人第一次听到&#xff0c;我想应该也会觉得赞成&#xff0c;这足以说明数据可视化的重要性。我们在前一篇博客中&#xff0c;介绍了如何利…

C语言基础 位域

C语言基础&#xff1a;位域 主题&#xff1a;位域&#xff08;bit-field&#xff09; 关键字&#xff1a;位域 冒号 结构体 存储空间 参考链接&#xff1a;C语言中文网&#xff1a;位域 、C菜鸟工具&#xff08;在线编译器&#xff09;、位域知乎问答 注&#xff1a;以下内容中…

VM安装linux虚拟机宿主机连接不上虚拟机问题处理及静态ip设置

VM安装linux虚拟机宿主机连接不上虚拟机问题处理 用 vm安装linux虚拟机宿主机连不上虚拟机&#xff0c;ipconfig宿主机发现VMnet1以及VMnet8的Ip都变成了169.254开头的地址&#xff0c;网上各种方式都试了都不行&#xff0c;要么 是 虚拟机连不上网&#xff0c;要么 是宿主机连…

金融测试岗面试有多难?我有秘招……

最近发现好多人都喜欢往金融测试岗跑&#xff0c;看来是真的很香了&#xff0c;但是你们知不知道面试金融测试岗还是很难的&#xff0c;如果想去面试真的要多做些了解再去&#xff0c;我在这里总结了一份面试文档分享给大家&#xff0c;若有需要&#xff0c;【留言777】即可。 …

windows 系统加固

其实Windows和Linux加固的方法都差不多 1.防火墙 1.防火墙的开启 2.入站规则进行设置 对一些端口更改后可以使用telnet 进行检测端口是否开放 2.安装杀毒软件 3.扫描漏洞&#xff0c;打补丁 一般漏洞扫描可以借用第三方平台对系统漏洞进行扫描。 开启补丁的自动更新 4.用…