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

  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;
	}
	// ...
}

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

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

相关文章

Linux 正则表达式

正则表达式有什么用&#xff1f;最基本的爬虫会用到&#xff0c;正则表达式简单来说就是匹配字符串的 比如&#xff1a;你匹配所有图片的链接地址 <img src"------(图片链接地址)"> 比如、abc/def URL:在WWW上&#xff0c;每一信息资源都有统一的且在网上…

(opencv)图像几何变换——缩放

图像缩放是指将图像的尺寸变小或变大的过程&#xff0c;也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失&#xff0c;因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩…

机器视觉初步5-1:图像平滑专题

在计算机视觉领域&#xff0c;图像平滑处理是一个重要的任务&#xff0c;用于降低噪声&#xff0c;提高图像质量。常见的图像平滑算法有均值滤波、中值滤波、高斯滤波等。本文将介绍这些算法的原理&#xff0c;并分别给出使用Python与Halcon实现的代码。&#xff08;当前版本&a…

什么是微软的 Application Framework?

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下什么是微软的 Application Framework&#xff1f; 到底什么是 Application Framework&#xff1f; 我当年学习这个的时候也困惑了好久&#xff0c;于是一直在搜索这个概念有没有好的解释&#…

ChatGPT时代:ChatGPT全能应用一本通

引言 随着人工智能技术的不断发展和进步&#xff0c;我们进入了ChatGPT时代。ChatGPT是基于GPT架构的大型语言模型&#xff0c;它具备强大的自然语言处理和生成能力&#xff0c;使得我们能够进行更加自由、流畅的对话。作为ChatGPT的全能应用&#xff0c;它可以被视为一本通&a…

【性能优化】性能优化

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 性能优化运行效率加载效率减少HTTP请求数量使用CDN缓存压缩文件、混淆样式表放在顶部、js代码放…

广告数仓:采集通道创建

系列文章目录 广告数仓&#xff1a;采集通道创建 文章目录 系列文章目录前言一、环境和模拟数据准备1.hadoop集群2.mysql安装3.生成曝光测试数据 二、广告管理平台数据采集1.安装DataX2.上传脚本生成器3.生成传输脚本4.编写全量传输脚本 三、曝光点击检测数据采集1.安装Zookee…

大数据周会-本周学习内容总结018

开会时间&#xff1a;2023.06.18 15:00 线下会议 01【调研-数据分析&#xff08;质量、ETL、可视化&#xff09;】 ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform…

开源游戏区块链项目分享:Unity开发的独立区块链

Arouse Blockchain [Unity独立区块链] ❗️千万别被误导&#xff0c;上图内容虽然都在项目中可寻&#xff0c;但与目前区块链的业务代码关联不大&#xff0c;仅供宣传作用(总得放些图看着好看)。之所以有以上内容是项目有个目标功能是希望每个用户在区块链上都有一个独一无二的…

如何看待 Facebook 上线支付功能?

随着科技的不断进步&#xff0c;电子支付在我们的生活中变得越来越普遍。最近&#xff0c;Facebook宣布推出自己的支付功能&#xff0c;这引起了广泛的关注和讨论。作为世界上最大的社交媒体平台之一&#xff0c;Facebook进入支付领域的举措无疑具有重要意义。那么&#xff0c;…

13年测试老鸟,带你详探服务端的接口测试,测试内卷之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 服务器的接口测试…

数据库第三章(SQL)

目录 1.SQL语言 索引 1.SQL语言 sql语言是个非过程性语言 sql的特点 1.综合统一&#xff0c;把增删查改都统一了起来 2.高度非过程化&#xff0c;不关心过程 3.面向集合的操作方式 sql基本语法 drop是删除表 delete是删除表的某个元组 安全方面&#xff1a;grant授权 revo…

EXCEL函数笔记1(数学函数、文本函数、日期函数)

数学函数 取整&#xff1a;INT(number) 取余&#xff1a;MOD(number,除数) 四舍五入&#xff1a;ROUND(number&#xff0c;保留几位小数) 取绝对值&#xff1a;ABS(number) 根号处理&#xff1a;SQRT&#xff08;number&#xff09; 0到1随机数&#xff1a;RAND&#xff08;&am…

【机器学习】十大算法之一 “朴素贝叶斯”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【LeetCode】每日一题 -- 1171. 从链表中删去总和值为零的连续节点 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list/ 1. 题解&#xff08;1171. 从链表中删去总和值为零的连续节点&#xff09; 2021年字节二面真题 1.1 暴力解法&#xff1a;穷举 时间复杂度 O(n2)&#xff0c;空间复杂…

【论文】attention is all you need

重点在第三节 attention is all you need摘要1. 绪论2. 背景3. 模型架构3.1 编码器和解码器堆叠 3.2 注意力3.2.1 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;3.2.2 多头注意力机制3.2.3 模型中注意力的应用 3.3 职位感知前馈网络&#xff08;Positio…

前端中间件Midway的使用

一、 关于midway1. 解决什么痛点2. 期望达到什么效果 二、创建应用并使用1. 创建midway应用2. 认识Midway2.1 目录结构2.2 Controller2.3 路由2.4 获取请求参数2.5 Web中间件2.6 组件使用2.7 服务(service) 三、写到最后 一、 关于midway Midway 是阿里巴巴 - 淘宝前端架构团队…

基于深度学习的高精度安全背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全背心检测识别系统可用于日常生活中或野外来检测与定位安全背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

微服务: 01-rabbitmq的应用场景及安装(docker)

目录 1. rabbitmq前言简介: 1.1 RabbitMQ的几个重要作用&#xff1a; -> 1.1.1 解耦&#xff1a; -> 1.1.2 异步通信&#xff1a; -> 1.1.3 流量削峰&#xff1a; -> 1.1.4 消息传递的可靠性和持久性&#xff1a; 2. rabbitmq的安装(docker版) -> 2.1 …

SpringMVC 学习整理

文章目录 一、SpringMVC 简介1.1 什么是MVC1.2 什么是Spring MVC1.3 Spring MVC的特点 二、SpringMVC 快速入门三、RequestMapping注解说明四、SpringMVC获取请求参数4.1 通过ServletAPI获取请求参数4.2 通过控制器方法的形参获取请求参数4.3 通过RequestParam接收请求参数4.4 …