弄清Resource、ResourceLoader、容器之间的微妙关系

Resource:

        在Java中,资源会被抽象成url,通过url前面的协议(如file:,classpath:)来处理不同的操作逻辑,resource是一个接口

Resource家族

具体的资源访问由其实现类完成,EncodedResource提供资源的编码处理,AbstractResource提供Resource的大量的默认公共实现,下面为特定类型的实现,ServletContextResource为访问web容器上下文资源设计的类,classPathResource方便访问类加载路径下的资源,尤其对于web应用来说,可以直接访问WEB-INF/classes下的资源,无需通过绝对路径,FileSysteResource用于访问系统资源,和File差不多,Resource只提供读操作,FileSysteResource继承WritableResource使其拥有写的能力。

Spring实现

上述通过ResourceLoader实现

DefaultResourceLoader获取Resource的具体实现类的实例

//获取Resource的具体实现类实例
	@Override
	public Resource getResource(String location) {
		Assert.notNull(location, "Location must not be null");
		//ProtocolResolver ,用户自定义协议资源解决策略
		for (ProtocolResolver protocolResolver : getProtocolResolvers()) {
			Resource resource = protocolResolver.resolve(location, this);
			if (resource != null) {
				return resource;
			}
		}
		//如果是以/开头,则构造ClassPathContextResource返回
		if (location.startsWith("/")) {
			return getResourceByPath(location);
		}
		//若以classpath:开头,则构造 ClassPathResource 类型资源并返回,在构造该资源时,
		// 通过 getClassLoader()获取当前的 ClassLoader
		else if (location.startsWith(CLASSPATH_URL_PREFIX)) {
			return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader());
		}
		else {
			//构造 URL ,尝试通过它进行资源定位,若没有抛出 MalformedURLException 异常,
			// 则判断是否为 FileURL , 如果是则构造 FileUrlResource 类型资源,否则构造 UrlResource。
			// 若在加载过程中抛出 MalformedURLException 异常,
			// 则委派 getResourceByPath() 实现资源定位加载
			try {
				// Try to parse the location as a URL...
				URL url = new URL(location);
				return (ResourceUtils.isFileURL(url) ? new FileUrlResource(url) : new UrlResource(url));
			}
			catch (MalformedURLException ex) {
				// No URL -> resolve as resource path.
				return getResourceByPath(location);
			}
		}
	}

ResourcePattenrnResolver 实现了ant风格的资源访问

ApplicationContext接口继承了ResourcePattenrnResolver,AbstractApplicationContext继承了ResourcePattenrnResolver,高级容器支持统一资源加载

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

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

相关文章

Python学习日记之学习turtle库(下 篇)

前言: 书接上篇,我们继续来了解Python内置库 turtle功能库。在前面的文章中,我们初步的了解了一下 turtle库,画布和画笔相关的函数,那么我们继续来深入了解一下吧。 详情见: Python学习日记之学习turtle库…

Spring web MVC(入门)

1、什么是MVC(一种思想) Model View Controller : Model—模型 View—视图 Controller—控制器 2、Spring MVC是一种实现(我们现在学的是Spring web,Spring mvc过时了) View属于前端问题我们后端人员不必太过于关注…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候,在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

Leetcode 73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示例 2: 输入&a…

力扣hot100题解(python版63-68题)

63、搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输…

在Blender中清理由Instant-NGP等几何学习技术生成的网格

使用布尔运算: 创建一个大的立方体或其他简单几何体包裹住全部网格。使用布尔修改器对两个网格进行“差集”运算。这将移除超出包裹体之外的多余网格部分。 手动选择并删除: 进入编辑模式(按Tab键)。按A键取消选择所有顶点。按B键并拖动以选择您想要删除…

【论文笔记】Language Models are Few-Shot Learners

Language Models are Few-Shot Learners 本部分是 GPT-3 技术报告的第一部分:论文正文、部分附录。 后续还有第二部分:GPT-3 的广泛影响、剩下的附录。 以及第三部分(自己感兴趣的):GPT-3 的数据集重叠性研究。 回顾…

vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载

文章目录 导文文章重点内容效果展示:代码展示这些方法适用于哪些场景 总结 导文 vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载 文章重点 内容效果展示: 当div拉到底部的时候: 编辑器返回: 代码展示 在…

来点基础的吧,JavaScript、JSP怎么打印输出,方便调试

这个对初学者肯定有用,自己写了代码,想看看对不对,想打印到页面上看看,都有哪些地方需要打印用哪些方法呢? 一、JavaScript的打印输出 1、console.log() console.log()是JavaScript中最常用的打印值方法之一。它将指…

React-router之简单使用

1.概念 说明:页面的跳转 2.安装 说明:路由采用CRA创建项目的方式进行基础环境配置。 npx create-react-app react-router-pro npm i react-router-dom 3.使用 import React from react; import ReactDOM from react-dom/client; import ./index.css;…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络: 可以用来:数据传输、数据共享 1. 网络协议模型: 1. OSI协议模型: 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式(数据包,流式)网络层数据的…

C#学习:初识各类应用程序

编写我们第一个程序——Hello,World! 1.编程不是“学”出来的,而是“练”出来的 2.在反复应用中积累,忽然有一天就会顿悟 3.学习原则: 3.1从感官到原理 3.2从使用别人的到创建自己的 3.3必需亲自动手 3.4必需学以致用,紧跟实际…

大模型思维链(CoT prompting)

思维链(Chain of Thought,CoT) **CoT 提示过程是一种大模型提示方法,它鼓励大语言模型解释其推理过程。**思维链的主要思想是通过向大语言模型展示一些少量的 exapmles,在样例中解释推理过程,大语言模型在…

HTML 学习笔记(七)列表

html中的列表分为以下三种:有序列表,无序列表和自定义列表 1.有序列表 有序列表由两个元素组成:元素ol和元素li,此两个元素是父子关系,li必须包裹在ol里使用, ol里直接嵌套的只有li,其嵌套效果…

【亲身经历】linux中使用mv命令之后,文件找不到

先说解决方案:移动过程的目的目录,使用了"/",这个斜杠标识加到目录名前面,表示会移动到根目录下的文件夹,而不是你想移动的那个文件夹,最后导致没找到。 某次升级tomcat的过程中,使用了mv移动文…

ky10 server 银河麒麟服务器主备搭建 (nginx+keepalived)

下载脚本代码 git clone https://gitcode.net/zengliguang/nginx_keepalived_ky10_x.git 进入脚本路径 更新脚本代码 更新完成 执行安装脚本 安装nginx离线编译安装依赖 解压nginx源码 检查环境 编译 nginx安装成功 安装keepalived keepalived安装成功

详解前端登录流程:实现原理与最佳实践

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

Mysql安装好后my.ini文件在何处

文章目录 报错 Invalid default value for ‘‘begin_time‘‘my.ini文件何在 背景:导入一个sql脚本时执行报错,需要修改my.ini中的一个配置 报错 Invalid default value for ‘‘begin_time‘‘ 需要修改my.ini中的slq-mode配置 参考的这个哥们博客配…

unityplayer.dll是什么,电脑缺少unityplayer.dll的解决方法分享

如何解决“缺失unityplayer.dll”错误?当您尝试启动一个应用程序或游戏时,您可能会看到一个错误消息,显示“找不到unityplayer.dll”或unityplayer.dll丢失。这通常是因为Unity引擎未正确安装或文件已丢失或损坏。这篇文章将向您介绍如何解决…

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…