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
目录
相关文章
|
1月前
|
JavaScript 前端开发 开发者
Vue执行流程及渲染解析
【10月更文挑战第2天】
104 58
|
1月前
|
JavaScript 前端开发 UED
Vue执行流程及渲染解析
【10月更文挑战第5天】
|
1月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
34 3
|
1月前
|
存储 缓存 边缘计算
揭秘直播带货背后的黑科技:播放流程全解析!
大家好,我是小米,今天聊聊社区直播带货的技术细节。我们将探讨直播播放流程中的关键技术,包括 HTTP DASH 协议、POP(Point of Presence)缓存和一致性哈希算法等。通过这些技术,直播流能根据网络状况动态调整清晰度,保证流畅体验。POP 和 DC 的多层次缓存设计减少了延迟,提升了观看效果。无论是技术人员还是直播运营者,都能从中受益。希望通过本文,你能更好地理解直播背后的技术原理。
43 3
|
1月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
51 1
|
30天前
|
敏捷开发 数据可视化 测试技术
解析软件项目管理:以板栗看板为例,其如何有效影响并优化软件开发流程
软件项目管理是一个复杂而重要的过程,涵盖了软件产品的创建、维护和优化。其核心目标是确保软件项目能够顺利完成,同时满足预定的质量、时间和预算目标。本文将深入探讨软件项目管理的内涵及其对软件开发过程的影响,并介绍一些有效的管理工具。
|
1月前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
15 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多