简单的class.getResource与classLoader.getResource区别

简单的getClass().getResource()与ClassLoader.getResource()区别

1.简介

我们在springboot项目中,如果要获取到自己配置的资源或者配置类信息一般会用到Class.getResource()或ClassLoader.getResource(),这两种方式在使用的过程中很容易混淆,此处进行简单测试记录一下使用过程中的区别

本次测试项目结构图如下:
在这里插入图片描述

2.测试代码

package cn.git.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @description: class.getResource与classLoader.getResource获取资源路径信息测试*  @program: bank-credit-sy* @author: lixuchun* @create: 2024-08-13*/
@RestController
@RequestMapping("/resource")
public class ResourceTestController {/*** 通过class获取资源路径信息* getResource("") 获取的是当前类所在包的路径,而 getResource("/") 获取的是 classpath 根路径*/@GetMapping("/class")public void test() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/System.out.println(this.getClass().getResource(""));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/System.out.println(this.getClass().getResource("/"));}/*** 获取文件信息* 需要注意的是 => .java编译后编程.class,所以这里参数传的文件名是.class结尾* 当以 "/" 开头时,是从 classpath 路径开始匹配资源* 当不以 "/" 开头时,是从当前类所在包的路径开始匹配资源* 两种方式都可以通过 "/" 或 "../" 在文件夹上下层路径切换** 另外,在获取文件时,我们还可以通过 getResourceAsStream 直接获取文件输入流* InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");* 且 getResourceAsStream() 和 getResource() 在获取文件流和文件路径时,路径选择机制是一样的。*/@GetMapping("/properties")public void properties() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.ymlSystem.out.println(this.getClass().getResource("/application.yml"));// nullSystem.out.println(this.getClass().getResource("custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dictSystem.out.println(this.getClass().getResource("/dict/custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/ResourceTestController.classSystem.out.println(this.getClass().getResource("ResourceTestController.class"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/helloApplication.classSystem.out.println(this.getClass().getResource("../helloApplication.class"));// nullSystem.out.println(this.getClass().getResource("../classpath/helloApplication.class"));}/*** 在使用 ClassLoader().getResource 获取路径时,不能以 "/" 开头,且路径总是从 classpath 根路径开始*/@GetMapping("/classLoader")public void classLoader() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/System.out.println(this.getClass().getClassLoader().getResource(""));// nullSystem.out.println(this.getClass().getClassLoader().getResource("/"));}/*** ClassLoader().getResource 只能从 classpath 开始获取资源,同样也能使用getResourceAsStream()获取文件输入流,且路径机制一样* 同Class.getResourceAsStream()一样,我们还可以通过ClassLoader.getResourceAsStream()直接获取文件输入流* ClassLoader.getResourceAsStream() 和 ClassLoader.getResource()在获取文件流和文件路径时,路径选择机制也是一样的*/@GetMapping("/classLoader/properties")public void classLoaderProperties() {// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.ymlSystem.out.println(this.getClass().getClassLoader().getResource("application.yml"));// nullSystem.out.println(this.getClass().getClassLoader().getResource("custom.dict"));// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dictSystem.out.println(this.getClass().getClassLoader().getResource("dict/custom.dict"));}}

3.结论

  • Class.getResource() 可以从当前 Class 所在包的路径开始匹配获取资源,也可以从 classpath 根路径开始匹配获取资源
  • ClassLoader().getResource() 只能从 classpath 根路径开始匹配获取资源
  • Class.getResource() 从当前包所在路径获取资源时不能以 / 开头,而从 classpath 根路径获取资源时必须以 / 开头
  • ClassLoader().getResource() 不能以 / 开头,且路径总是从 classpath 根路径开始
  • 它们都能通过 getResourceAsStream() 方法获取对应路径文件的输入流,文件路径匹配机制和其 getResource() 方法一样

本文转载此篇知乎文章,进行部分简单修改方便自己记录以及后续学习使用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧景区系统:科技赋能旅游新体验

随着信息技术的飞速发展,旅游业正经历着前所未有的变革,智慧景区系统作为这一变革的先锋,正以其独特的魅力重塑着游客的旅行方式。智慧景区系统,顾名思义,是运用物联网、大数据、云计算、人工智能等现代信息技术&#…

NFT 合约:部署 ERC 721 到 Testnet 并发布

目录 1. 创建智能合约2. 配置 Network3. 配置发布脚本4. 执行发布命令Refs1. 创建智能合约 访问: https://wizard.openzeppelin.com/#erc721 填入必要信息,勾选选项。然后点击【Download】下载 hardhat 开发版本。 2. 配置 Network 在 hardhat.config.ts 中添加网络配置:…

Golang面试题六(GMP)

目录 1.Go线程实现模型 1:1 关系 N:1关系 M:N关系 2.GM模型 3.GMP模型 概念 模型简介 有关P和M的个数问题 P和M何时会被创建 4.调度器的设计策略 5.go func() 调度流程 6.调度器的生命周期 7.Go work stealing 机制 8.Go hand off 机制 9.Go 抢占式调度 9.Sys…

外卖O2O系统开发源码开源介绍

外卖O2O系统开发源码开源介绍 开源外卖O2O系统源码可以为开发者提供快速搭建外卖平台的基础,节省从零开始的开发时间。 以下是几个推荐的开源项目: flash-waimai 是一个基于Spring Boot和Vue.js的前后端分离的外卖系统,包含手机端和后台管理…

spring boot 发送微信小程序订阅消息

首先我们需要订阅一个消息: 订阅教程本文章并未提起,感兴趣的同学自行百度。 我们可以看到订阅消息中【消息内容】有很多参数,我们在发送消息时就需要将这些参数进行填充,当然填充的时候要注意格式,如果格式不对还是会…

LDR6020在Type-C手机同时充电与USB2.0数据传输方案

随着科技的飞速发展,Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求,乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能,为Type-C手机提供了同时充电与USB2.0数据传…

关于归并排序:

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2F return 语句开始之后&#xff0c;会执行之前剩余遗留下的语句和状态#include<bits/stdc.h> using namespace std…

使用RestHighLevelClient进行Elasticsearch Function Score查询

简介 Function Score查询在Elasticsearch中是一个强大的工具&#xff0c;它允许我们根据一个或多个函数来调整查询结果的相关性得分。这使得我们可以基于某些条件对搜索结果进行更精细的控制。本文将介绍如何在Java应用程序中使用Elasticsearch的RestHighLevelClient执行Funct…

快速把文件名统计到excel表的方法

文件名统计到EXCEL表&#xff0c;这似乎很多人都没听说过&#xff0c;因为它与EXCEL表格不沾边&#xff0c;那么这个需求如何实现&#xff0c;用到什么方法&#xff0c;今天给大家介绍一个比较实用的方法&#xff0c;它可以把文件名或文件夹的名快速提取并统计到EXCEL表格上去。…

【Day05】0基础微信小程序入门-学习笔记

文章目录 基础加强学习目标使用npm包1.准备项目2. 小程序对于npm的支持和限制3. Vant Weapp小程序UI组件库4. 使用Vant组件5. 定制全局主题样式6. API Promise化 全局数据共享1. 简介2. MobX2.1 安装MobX相关包并构建npm2.2 创建MobX的Store实例2.3 将Store成员绑定到页面中2.4…

ppt中添加页码(幻灯片编号)及问题解决方案

在幻灯片母版中&#xff0c;选择插入 幻灯片编号 右下角显示幻灯片编号 问题一&#xff1a;母版中没有显示编号 原因可能是母版版式中没有设置显示&#xff0c;勾选即可。 问题二&#xff1a;子母版中没有显示幻灯片 将母版中的编号复制到子母版中。 问题三&#xff1a;应用…

股指期货套期保值中的展期管理有哪些?

在复杂的金融市场环境中&#xff0c;展期作为一种重要的风险管理工具&#xff0c;被广泛应用于期货交易中&#xff0c;特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于&#xff0c;通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约&#xff0c;…

神经发育过程中结构性大脑不对成的大规模分析

摘要 目前&#xff0c;只有少数研究评估了儿童期和青春期两个大脑半球之前的结构差异&#xff0c;而且现有的研究结果缺乏一致性&#xff0c;或者局限于特定的脑区、特定的大脑特征或相对较窄的年龄范围。在这里&#xff0c;本研究考察了大脑不对称性与年龄和性别之间的关系&a…

Java SE--IO流

一.File类型 如果我们想在程序中操作或者描述一个文件夹或文件&#xff0c;可以使用File类型 File类型在java.io包下 File可以新建&#xff0c;删除&#xff0c;移动&#xff0c;修改&#xff0c;重命名文件夹&#xff0c;也可以对文件或者文件夹的属性进行访问&#xff1b;…

进阶!haproxy高级功能与配置

文章目录 前言基于cookie的会话保持IP透传四层IP透传未开启状态开启透传状态 七层IP透传 自定义错误界面重定向HAProxy 四层负载之数据库HAProxy https 前言 本文主要介绍HAProxy高级配置及使用案例 文章相关连接如下&#xff1a; 如果想深入了解haproxy算法的相关知识&…

EXCEL数据清洗步骤

1.合并的单元格&#xff1a; 用Ctrlg查找空值&#xff0c;拆分单元格&#xff0c;ctrl enter填充 2.空值空行&#xff1a; 辅助列counta&#xff0c;筛选出空值行 3.重复值&#xff1a; 条件格式——突出显示单元格规则——重复值 数据——数据工具——删除重复值 4.脏数据…

[算法2] 第二集 二叉树中的深度搜索

深度优先遍历&#xff08;DFS&#xff0c;全称为 Depth First Traversal&#xff09;&#xff0c;是我们树或者图这样的数据结构中常⽤的 ⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分支&#xff0c;直到⼀条路径上的所有节点都被遍历 完毕&#xff0c;然后再回溯到上…

Steinberg SpectraLayers Pro for Mac:专业音频频谱编辑的巅峰之作

Steinberg SpectraLayers Pro for Mac是一款专为音频专业人士设计的专业音频频谱编辑器&#xff0c;它以其强大的频谱编辑功能和直观的操作界面&#xff0c;在音频处理领域树立了新的标杆。该软件不仅为音频编辑工作带来了前所未有的精确度和灵活性&#xff0c;还极大地提升了音…

WPF 数据模板DataTemplate、控件模板ControlTemplate、Style、ItemsPreseter

一言蔽之&#xff0c;Template就是“外衣”—— ControlTemplate是控件的外衣&#xff0c; DataTemplate是数据的外衣。 DataTemplate 它定义了一个数据对象的可视化结构 DataTemplate常用的地方有3处&#xff0c;分别是&#xff1a; ContentControl的ContentTemplate属性&…

CODEXGRAPH:突破代码与AI的壁垒,开启智能编程新时代

CODEXGRAPH&#xff1a;突破代码与AI的壁垒&#xff0c;开启智能编程新时代 CODEXGRAPH论文阅读1. 概述2. 相关研究代码库级别的任务检索增强代码生成&#xff08;RACG&#xff09; 3. CODEXGRAPH系统设计代码图数据库的构建与图数据库的交互 4. 实验设计与结果CrossCodeEvalSW…