MyBatis | 使用Resources读取资源文件流程解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 使用Resources读取资源文件流程解析

读取资源文件

MyBatis中读取资源文件示例代码:

// 资源文件路径,MyBatis配置文件
String resource = "mybatis-config.xml";
// 读取资源文件,获取一个输入流对象
InputStream inputStream = Resources.getResourceAsStream(resource);

在 MyBatis 中使用ResourcegetResourceAsStream()方法读取资源文件,在getResourceAsStream()方法内部,又去调用了ClassLoaderWrappergetResourceAsStream方法。
ClassLoaderWrapper类中getResourceAsStream方法的源码如下:

/**
 * 依次使用5种类加载器读取资源文件
 * @param resource 资源文件路径
 * @param classLoader 类加载器
 * @return 资源文件流,可能为null
 */
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
   
   
  // 依次使用5种类加载器
  for (ClassLoader cl : classLoader) {
   
   
    // 如果类加载器不为空
    if (null != cl) {
   
   
      // 读取资源文件
      InputStream returnValue = cl.getResourceAsStream(resource);
      // 如果上步读取到的内容为空,会在资源文件路径前添加斜杠,然后再次读取资源文件
      if (null == returnValue) {
   
   
        returnValue = cl.getResourceAsStream("/" + resource);
      }
      // 如果成功读取到资源文件内容,返回资源文件流
      if (null != returnValue) {
   
   
        return returnValue;
      }
    }
  }
  // 如果使用所有的类加载器后仍然没有成功读取资源文件,则返回null
  return null;
}

其中参数resource为资源文件路径,classLoaderClassLoaderWrapper中内置的类加载器数组。
使用ClassLoaderWrapper读取资源文件或者加载类时,依次使用自定义类加载器、默认类加载器、线程上下文类加载器、MyBatis类加载器、系统类加载器。如果类加载器为空或者读取到的内容为空,会继续尝试使用下一个类加载器。
MyBatis读取资源文件类加载器使用顺序.jpg

读取资源文件时,单个类加载器执行流程如下图:
MyBatis单个类加载器读取资源文件流程.jpg

类加载器

ClassLoaderWrapper中封装了5种类加载器,这5种类加载器可以通过getClassLoaders方法获取。getClassLoaders方法代码如下所示:

/**
 * 获取所有类加载器
 * @param classLoader 自定义类加载器
 * @return 所有类加载器
 */
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
   
   
  return new ClassLoader[] {
   
   
    classLoader,
    defaultClassLoader,
    // 当前线程的上下文类加载器
    Thread.currentThread().getContextClassLoader(),
    // MyBatis类的类加载器
    getClass().getClassLoader(),
    // 系统类加载器
    systemClassLoader
  };
}

由上面的代码可以看出,5种类加载器分别为:

  • 自定义类加载器,可能为 null;
  • 默认类加载器,可能为 null;
  • 线程上下文类加载器;
  • MyBatis类加载器;
  • 系统类加载器,在ClassLoaderWrapper
目录
相关文章
手机上网流程解析
【9月更文挑战第5天】
|
24天前
|
测试技术 持续交付 UED
|
20天前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
39 1
|
12天前
|
缓存 网络协议 Linux
DNS的执行流程是什么?
DNS的执行流程是什么?
25 0
|
20天前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
37 0
|
20天前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
79 0
|
20天前
|
监控 测试技术 API
|
6天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
22天前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
72 1
|
1月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。

热门文章

最新文章

推荐镜像

更多