关于Spring Boot中的getResources

SpringBoot项目打成jar包后,无法读取resources下的文件 最近在使用aspose将word转PDF并进行签章打印,读取凭证文件时遇到一个问题,凭证文件放在resources目录下,Windows下可正常读取,但是打成jar包部署到Linux服务器上却取不到文件。由此问题引出以下思考: 在本地项目读取文件时 this.getClass().getClassLoader().getResource("").getPath()+fileName this.getClass().getResource("/filename").getPath() 都是可以成功的; 但是j 阅读详情

关于Spring Boot中的getResources

在前一篇讲Spring Boot启动流程的文章中,在获取Initializers和Listeners的时候都会通过ClassLoader的getResources方法获取相关文件的全限定名。

今天着重分析一下ClassLoader.getResources,ClsasLoader.getResource,Class.getResource

1.Class.getResource

看下面一段代码

System.out.println(TestResources.class.getResource("Test.xml"));
System.out.println(TestResources.class.getResource("/Test.xml"));

返回结果:

null
file:/Users/xujingzhou/IdeaProjects/test-resources/target/classes/Test.xml

我们先看现象,同样都是调用调用class.getResource方法,为什么会有不同的结果呢。

首先看一下class.getResource()

public java.net.URL getResource(String name) {
    name = resolveName(name);
    //获取当前的类加载器
    ClassLoader cl = getClassLoader0();
    if (cl==null) {
        // A system class.
        //调用系统类加载器
        return ClassLoader.getSystemResource(name);
    }
    //调用classLoader的getResource方法
    return cl.getResource(name);
}

首先调用的是resolveName(),根据我们传入的参数一个加‘/’一个没加,刚好在resolveName中存在判断。

private String resolveName(String name) {
    if (name == null) {
        return name;
    }
    //如果name的开头不包含'/'
    if (!name.startsWith("/")) {
        //获取当前类
        Class<?> c = this;
        while (c.isArray()) {
            c = c.getComponentType();
        }
        //获取当前类名
        String baseName = c.getName();
        //获取最后一个'.'出现的坐标
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
            //将当前传入的name拼接到当前类路径下
            name = baseName.substring(0, index).replace('.', '/')
                +"/"+name;
        }
    } else {
        //返回去除‘/’之后的名字。
        name = name.substring(1);
    }
    return name;
}

看到这里,我们应该去看看ClassLoader中的getResource是如何实现的了,先做个小实验吧。

System.out.println(TestResources.class.getClassLoader().getResource("Test.xml"));
System.out.println(TestResources.class.getClassLoader().getResource("/Test.xml"));

输出结果:

file:/Users/xujingzhou/IdeaProjects/test-resources/target/classes/Test.xml
null

先看结论,当传入的name为文件名的时候,是可以找到当前文件的全限定名的。但是为路径的时候就找不到了,接下来就看看是如何实现的。

public URL getResource(String name) {
    URL url;
    //如果父加载器不为null,则调用父加载器,符合双亲委派机制
    if (parent != null) {
        url = parent.getResource(name);
    //这其实是一个递归调用,最终都会走到这一步调用系统启动类加载器
    } else {
        url = getBootstrapResource(name);
    }
    //一个递归回退的过程,都会走一遍findResource方法
    if (url == null) {
        url = findResource(name);
    }
    return url;//如果最后都没加载到,双亲委派机制失败,加载应用自身的类加载器
}

可是这样做的目的是为了什么呢

现在主要分为两种情况

  1. name前加‘/’
    1. TestClassLoader.class.getResource("/")
      1. Class类中的getResource方法返回的是""
      2. ClassLoader类中的getResource方法返回的是 路径
    2. TestClassLoader.class.getClassLoader().getResource("/")
      1. ClassLoader类中的getResource方法返回的是 null
  2. name前不加‘/’
    1. TestClassLoader.class.getResource("")
      1. Class类中的getResource方法返回的是 路径
      2. ClassLoader类中的getResource方法返回的是 路径
    2. TestClassLoader.class.getClassLoader().getResource("")
      1. ClassLoader类中的getResource方法返回的是 路径
  • class的getResource

    • 当path不以‘/’开头我们就可以获得和当前类在路径相同的文件,也就是我们说的同级
    • 当path以‘/’开头时,这样就可以获取到classpath下任意路径下的资源
  • classLoader的getResource

    • 当path不以‘/’开头的时候,首先通过双亲委派机制,逐级向上委托的形式加载,最后发现双亲没有加载,然后通过当前类加载classpath下资源文件
    • 当path以‘/’开头时,‘/’表示boot classLoader中的加载范围,这个类是CPP写的,所以加载范围是null。
Spring Boot整合MyBatis:企业级Java持久层实践 ORM框架作为Java企业应用开发的核心组件,通过对象关系映射简化数据库操作。MyBatis作为半自动化ORM框架,以其灵活的SQL控制能力著称,特别适合需要精细优化查询性能的场景。Spring Boot的自动配置特性与MyBatis结合后,能显著提升开发效率,减少样板代码。这种技术组合在电商系统等高并发应用中表现优异,支持动态SQL构建、多数据源配置等高级特性。通过PageHelper插件实现分页查询、利用声明式事务管理保证数据一致性,开发者可以快速构建健壮的持久层。本文以电商后台系统为例,详解Sprin 阅读详情

相关推荐

Spring Boot3整合MyBatis-Plus实战与避坑指南

ORM框架作为Java持久层的核心技术,通过对象关系映射简化数据库操作。MyBatis-Plus作为MyBatis的增强工具,提供了更便捷的CRUD操作和条件构造器。在Spring Boot3环境下,其自动配置机制和SQL生成原理有了重要变化,需要特别注意依赖管理、实体映射等核心配置。本文针对企业级应用开发场景,详细解析Spring Boot3与MyBatis-Plus整合过程中的版本兼容性问题、Lambda表达式条件构造器的正确用法,以及分页插件、二级缓存等高级特性的配置要点,帮助开发者规避常见陷阱,提升

weixin_33739541的博客 424

九种方式获取resources目录下文件的方式

本文中提供了九种方式获取resources目录下文件的方式。

科技互联网领域深度探索者,乐于分享与写作。 4245

Spring Boot多数据源配置实战:Druid+MyBatisPlus整合指南

在微服务架构中,多数据源配置是解决业务分库、读写分离等场景的常见需求。通过连接池技术(如Druid)可以高效管理数据库连接,而ORM框架(如MyBatisPlus)则简化了数据库操作。本文以Spring Boot为基础,详细解析如何整合Druid连接池与MyBatisPlus实现多数据源访问,包括配置陷阱规避、事务管理方案以及性能监控技巧。特别针对MySQL与TiDB混合使用场景,提供了经过生产验证的解决方案,帮助开发者避免常见的'Invalid bound statement'等异常问题。

weixin_34290096的博客 542

SpringBoot项目中读取resource目录下的文件(六种方法)

源码里还是方法三、方法四,只不过做了一些封装,更方便开发。2)启动jar包指令。

weixin_63742275的博客 2万+

Druid Spring Boot Starter 1.2.28 多数据源配置:3分钟搞定MySQL+H2双库连接

本文详细介绍了如何使用Druid Spring Boot Starter 1.2.28快速配置MySQL和H2双数据源,包括依赖配置、YAML设置、Java配置类实现以及多数据源监控技巧。通过实战示例和最佳实践,帮助开发者高效管理多数据源,提升企业级应用开发效率。

weixin_33888907的博客 437

Spring Boot 3.5整合MyBatis-Plus最佳实践

ORM框架是Java企业级开发中的核心技术组件,通过对象关系映射简化数据库操作。MyBatis-Plus作为MyBatis的增强工具,在保留原生特性的基础上提供了更强大的CRUD操作和条件构造能力。结合Spring Boot的自动配置特性,开发者可以快速构建高效的数据访问层。在实际工程实践中,合理配置分页插件、优化SQL执行效率、处理多数据源场景是提升系统性能的关键。本文以Spring Boot 3.5和MyBatis-Plus最新稳定版为例,详解从基础配置到高级特性的完整整合方案,特别针对分页失效、性能瓶

weixin_34008805的博客 497

jar包:读取resources目录下的文件路径

类获取文件流,SpringBoot中所有文件都在jar包中,没有一个实际的路径,因此可以使用以下方式。

Pastthewind的博客 4025

Spring Boot 3.x 多数据源整合 Druid:3 种配置方案对比与性能实测

本文详细对比了Spring Boot 3.x整合Druid多数据源的三种配置方案(YAML、编程式、混合),并通过性能测试数据提供选型建议。重点分析了Druid连接池在多数据源场景下的优势,包括完善的监控功能和SQL防火墙支持,帮助开发者高效管理企业级应用中的复杂数据源需求。

weixin_34082854的博客 414

springboot中如何获取resources下资源和其他路径资源

// 获取当前项目根路径 String dir = System.getProperty("user.dir"); import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; // 获取resource 下的资源 Resource resource = new ClassPathResource("license.xml"); System.out.println(r

进击的豌豆的博客 5548

Spring Boot 3+Druid多数据源配置与监控实战

数据库连接池是Java企业级应用中的核心组件,负责管理数据库连接的创建、使用和回收。Druid作为阿里开源的连接池实现,不仅具备高性能连接管理能力,更以其强大的监控功能著称。通过内置的SQL统计、连接池状态可视化等特性,开发者可以实时掌握SQL执行情况,快速定位性能瓶颈。结合Spring Boot 3的自动化配置,可以轻松实现多数据源动态切换,满足主从分离、分库分表等复杂场景需求。本文以电商系统为例,详细演示如何配置Druid监控页面、实现SQL日志打印,并分享生产环境中连接泄漏检测、慢SQL优化等实战经验

weixin_34343308的博客 428

物体检测之非极大值抑制:NMS、softNMS、softerNMS、IoU-Net

当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用NMS过滤掉重叠的候选框,得到最佳的预测输出。当前有如下几种较为常见的NMS方法, 1.基本NMS 非极大值抑制, 顾名思义就是抑制不是极大值的边框,这里的抑制通常是直接去掉冗余的边框。 这个过程涉及以下两个量化指标: 1.预测得分:NMS假设一个边框的预测得分越高,这个框...

LeoLee 1941

Spring Boot整合MyBatis与PostgreSQL开发实践

ORM框架是Java企业级开发中连接应用与数据库的关键组件,MyBatis作为半自动化ORM以其SQL灵活性广受欢迎。结合Spring Boot的自动配置能力,开发者可以快速构建数据访问层,而PostgreSQL凭借其丰富的特性成为理想的关系型数据库选择。这种技术组合特别适合需要平衡开发效率与SQL控制权的场景,如快速迭代的中小型项目或处理复杂数据类型的应用。通过动态SQL、分页处理和事务管理等高级特性,开发者能够构建高性能的数据访问方案。

weixin_30740581的博客 330

银河麒麟V10安装docker

最近在做的一个信创项目使用的操作系统是银河麒麟高级服务器V10,在安装docker时,会遇到下面的错误。 nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.0-3.el7.x86_64 经过分析,以下依赖包是centos系统中的包,所以需要给kylinos创建一个合适的centos源。经过实验,Kylin Linux Advanced Server V1

m0_38004228的博客 4907

MyBatis Plus在Spring Boot中的高效数据访问实践

MyBatis Plus作为MyBatis的增强工具,通过封装通用CRUD操作和提供条件构造器,显著简化了Java持久层开发。在Spring Boot生态中,它通过BaseMapper接口、类型安全的QueryWrapper以及代码生成器等特性,实现了与JPA类似的开箱即用体验,同时保留了MyBatis的灵活性。对于企业级应用,MyBatis Plus支持多租户、数据权限等高级功能,并能与Spring Cloud生态无缝集成。无论是快速开发还是复杂查询场景,合理运用MyBatis Plus的条件构造器和Ac

weixin_30764883的博客 424

TP4056在单节锂电池充电管理中的创新应用与电路优化

本文深入探讨了TP4056线性充电管理芯片在单节锂电池充电电路中的创新应用与优化方案。针对“边充边用”的核心挑战,文章详细解析了利用PMOS管构建智能供电切换电路的原理,实现了外部电源与电池供电的无缝、安全切换,有效杜绝了电池“边充边放”的风险。同时,提供了关键的元器件选型、PCB布局布线技巧及常见问题排查指南,为创客和硬件开发者提供了高性价比、高可靠性的锂电池电源管理实践方案。

rock5的博客 501

TI AWR1642实战指南:CCS调试mmWave Demo Visualizer全流程解析

本文详细解析了TI AWR1642开发板的CCS调试流程,重点介绍了mmWave Demo Visualizer的使用方法。从环境准备、版本确认到bin文件烧录、CCS工程配置,再到调试启动与结果验证,提供了全流程的实战指南,帮助开发者快速掌握AWR1642的调试技巧,避免常见错误。

weixin_30790841的博客 110

Spring Boot整合MyBatis实战与优化指南

ORM框架是Java企业开发中数据持久层的核心技术,MyBatis作为半自动化的ORM解决方案,通过XML/注解配置实现SQL与代码的解耦。其动态SQL和二级缓存机制能有效应对复杂查询场景,配合Spring Boot的自动配置特性,可快速构建高性能数据访问层。在电商、金融等对数据库操作有精细化控制需求的领域,这种组合能兼顾开发效率和执行性能。通过配置多数据源、批量操作优化等技巧,可进一步提升系统吞吐量。本文以Spring Boot+MyBatis整合为例,详解从基础配置到高级特性的全链路实践方案。

weixin_34342992的博客 324

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1357

Spring Boot与MyBatis整合开发实践指南

ORM框架是Java企业级开发中数据持久层的核心技术,MyBatis作为半自动ORM的代表,通过SQL映射文件提供了对原生SQL的完全控制能力。其核心原理基于JDBC封装,通过SqlSessionFactory构建会话、Executor执行SQL、TypeHandler处理类型转换。相比全自动ORM,MyBatis在复杂查询、存储过程调用等场景具有显著优势,特别适合需要精细控制SQL性能的项目。Spring Boot 3.5通过自动配置简化了MyBatis集成,两者组合可快速构建高效数据访问层。本文以电商系

chuiqi9947的博客 506

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6275

手把手教你用ESP32-C3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-C3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5523

Spring Boot 3.5与MyBatis整合实战与性能优化

ORM框架作为Java企业级开发的核心组件,其性能优化与正确配置直接影响系统稳定性。MyBatis通过SQL与代码解耦的方式提供灵活的数据访问层方案,而Spring Boot的自动配置机制大幅降低了整合复杂度。在微服务与云原生架构下,合理的二级缓存设计与批量操作优化可提升300%以上的数据库吞吐量。针对高并发场景,需要特别注意动态SQL的线程安全问题与连接泄漏检测。本文基于Spring Boot 3.5最新特性,详解如何规避MyBatis常见陷阱,并通过Redis缓存改造、虚拟线程适配等方案实现生产级性能飞

cuiyingchan0663的博客 424

如何在 Windows 中实时打开字幕

在 Windows 操作系统中,你可以使用编程来实现实时字幕功能,以便在屏幕上显示即时的文字内容。下面是一个示例代码,展示了如何使用Python编程语言在Windows上实现实时字幕功能。这样,字幕窗口将会不断地显示系统当前时间作为字幕。你可以根据自己的需求修改主循环中的内容,以显示你想要的实时字幕。希望以上代码和说明能够帮助你在Windows中实现实时字幕功能。函数创建了一个顶级窗口,并设置窗口的样式、位置和大小。方法,用于在字幕窗口中显示指定的字幕内容。上述代码中,我们使用了Python的。

DevWizard的博客 3267

Spring Boot多数据源配置实战:Druid+MyBatisPlus最佳实践

数据库连接池是Java企业应用中的核心组件,负责管理数据库连接的创建、使用和回收。Druid作为阿里开源的连接池实现,凭借其监控能力和稳定性成为行业首选。在Spring Boot框架下,结合MyBatisPlus这一强大的ORM工具,开发者可以高效实现多数据源架构。这种技术组合特别适用于电商平台、多租户系统等需要同时访问多个数据库的场景。通过合理配置Druid连接池参数和MyBatisPlus插件,不仅能解决Spring Boot默认单数据源的限制,还能获得SQL监控、性能优化等企业级功能。本文详细展示了如

weixin_33698823的博客 442

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Boot 多数据源 + Druid 四大方案完整实战

本文介绍了Spring Boot项目中实现多数据源配置的四种方案,重点展示了第一种手动配置方案。方案一适用于固定2-3个数据源的场景,通过不同Mapper包路径隔离数据源访问。 核心配置包括: 引入druid-spring-boot-3-starter和数据驱动依赖 application.yml中配置多个数据源(MySQL/PostgreSQL/阿里云RDS)的Druid连接池参数 使用@SpringBootApplication(exclude排除自动配置) 该方案特点: 简单直接,适合少量固定数据源

m0_48853274的博客 325

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring Boot 3.3 配置简化与启动性能优化实战

Spring Boot 是基于 Spring 框架的快速开发脚手架,其核心价值在于自动配置、起步依赖和生产就绪特性。随着微服务规模扩大,传统配置方式导致重复冗余、环境耦合与启动缓慢等典型问题。Spring Boot 3.3 通过配置分组(group)、类加载优化、Bean 定义压缩及 JVM 自动调优等机制,在不改变架构前提下显著降低认知负荷与运行开销。该版本尤其强化了对 AI 集成与原生镜像的支持,使开发者能更聚焦业务逻辑而非胶水代码。本文围绕配置简化与启动性能两大高频痛点,结合真实生产数据与可落地的升级

weixin_34038293的博客 881

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: SpringBoot启动流程中的Initializer和Listeners
徐旌洲
博客等级 码龄10年 5粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值