关于Mybatis源码探究的专栏。

其我的专业是软件技术这个方向的,mybatis 许久以前就学了,但是心里一直存在一些疑惑。也上网查了,看过各种大佬的博客,对

于Mybatis的理解始终感觉不足。最后还是决定要来肝它。

文字功底一般,请谅解。

若有不足,还望能够指正。

喜欢一句话:
“八小时以内谋生存,八小时以外谋发展”。

---- 趁着还没有毕业,再看看学校的夜晚,学校的风景。

Java 获取mybatis-config.xml的输入流

    • 获得加载核心配置文件的inputStream流
      • 1)Resources.getResourceAsStream(String resource) 方法
      • 2)getResourceAsStream(null, resource); 方法
      • 3) classLoaderWrapper.getResourceAsStream(resource, loader);
      • 4)getResourceAsStream(resource, getClassLoaders(classLoader));
      • 5)cl.getResourceAsStream(resource);
  • 牵扯到的小知识点:
    • 自言自语

获得加载核心配置文件的inputStream流

1)Resources.getResourceAsStream(String resource) 方法

这是我们都写过的一段代码,大家都知道,里面就是一个千层饼哈。

String resource="mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);

null 传的是空的类加载器,这里传过去空,但是在后面能够获得一些其他的类加载器。


public static InputStream getResourceAsStream(String resource) throws IOException {return getResourceAsStream(null, resource);
}

2)getResourceAsStream(null, resource); 方法

将类路径上的资源作为 输入流对象 返回

先将源码贴出来,下面再讲。

public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);if (in == null) {throw new IOException("Could not find resource " + resource);}return in;
}

我们在这段代码中,有看到InputStream对象的获得和返回,证明这classLoaderWrapper.getResourceAsStream(resource, loader); 个地方就是新建 InputStream 的地方,我们可以从这里入手,继续往下。

  1. 先看classLoaderWrapper 是怎么来的,要干什么事情

    private static ClassLoaderWrapper classLoaderWrapper = new ClassLoaderWrapper();
    

这里用到的classLoaderWrapper 我搜到的解释如下:

  • 在MyBatis的IO包中封装了ClassLoader以及读取资源文件相关的API。

  • 在ClassLoaderWrapper是一个ClassLoader的包装器,其中包含了多个ClassLoader对象。
    通过调整多个类加载器的使用顺序。使用ClassLoaderWrapper就如同使用ClassLoader对象,ClassLoaderWrapper 会按照指定的顺序依次检测其中封装的ClassLoader对象,并从中选取第一个可用的ClassLoader完成相关功能

    ClassLoaderWrapper中定义了两个字段,分别记录了系统指定的默认加载器(defaultClassLoader)和系统加载器(systemClassLoader)

  • ClassLoaderWrapper的主要功能分为三类:
    getResourceAsURL()
    getResourceAsStream()
    classFormName()

  • 原文链接:https://blog.csdn.net/xl3379307903/article/details/80994509

3) classLoaderWrapper.getResourceAsStream(resource, loader);

从类路径中获取资源,从特定的类加载器开始

参数解释:
resource——要查找的资源
classLoader – 第一个要尝试的类加载器

  public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {return getResourceAsStream(resource, getClassLoaders(classLoader));}

我们可以看到它又接着去调用了他的重载函数,但是我们在去看之前,先看看第二个参数是什么东西吧,不然会接着搞不明白。

**getClassLoaders(classLoader)**牵扯到的源码是这样的:

==注意:==这个方法返回是不会存在空值的,叠底的都还有系统类加载器勒

// 我们传过来的参数是null,但是我们返回的这个ClassLoader[] 数组,是肯定有值的。
ClassLoader[] getClassLoaders(ClassLoader classLoader) {return new ClassLoader[]{classLoader, /** 此处是null ,我们传过来的*/ defaultClassLoader,  /**此处也是null */ Thread.currentThread().getContextClassLoader(),/**使用当前线程的ClassLoader */getClass().getClassLoader(),/**使用当前类的ClassLoader */systemClassLoader};/**使用系统ClassLoader,即系统的入口点所使用的ClassLoader。 */}

我们返回接着往下看啊

4)getResourceAsStream(resource, getClassLoaders(classLoader));

这个方法的作用就是尝试从一组类加载器中获取资源 获取到了就会返回一个 InputStream 输入流对象给我们。

InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {for (ClassLoader cl : classLoader) {if (null != cl) {// try to find the resource as passedInputStream returnValue = cl.getResourceAsStream(resource);// now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resourceif (null == returnValue) {returnValue = cl.getResourceAsStream("/" + resource);}if (null != returnValue) {return returnValue;}}}return null;
}

下面还接着嵌套了两个方法,实际作用就是找到文件所在的绝对地址,获取里面的内容。

5)cl.getResourceAsStream(resource);

    public InputStream getResourceAsStream(String name) {Objects.requireNonNull(name);URL url = getResource(name);try {return url != null ? url.openStream() : null;} catch (IOException e) {return null;}}

我debug 时候的图,给大家看一下吧。 可以看到在这里,

url.openStream();打开到此URL的连接并返回一个InputStream以从该连接读取。没有什么可看的。

牵扯到的小知识点:

检查指定的对象引用不为null 。

 Objects.requireNonNull(name);

此方法主要用于在方法和构造函数中进行参数验证,如下所示:

public Foo(Bar bar) {this.bar = Objects.requireNonNull(bar);
}

自言自语

未来还很远,记得给自己加油。

Mabatis 源码探究(2)Java 获取mybatis-config.xml的输入流 inputStream对象相关推荐

  1. Mybatis 源码探究 (3)创建 SqlSessionFactory对象 执行sqlSession.getMapper()方法

    Mybatis 源码探究 (3)创建 SqlSessionFactory对象 时隔许久,终于又能接着来搞他啦.Mybatis 一起来探究吧. 先笑会再进入主题吧 开始啦 一.new SqlSessio ...

  2. Mybatis日志源码探究

    一.项目搭建 1.pom.xml <dependencies><dependency><groupId>log4j</groupId><artif ...

  3. java后台oa项目整套,[VIP源码]【S020】springboot+mybatis+bootstrap开发员工oa后台管理系统项目源码...

    java源码项目名称:springboot+mybatis+bootstrap开发员工oa后台管理系统项目源码springboot项目源码0 `" C+ a" `" ~0 ...

  4. Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 ‘?

    Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 '? 出于好奇,然后就有了这篇文章啦. 源码给我的感觉,是一座大山的感觉.曲曲折折的路很多,点进去就有可能出不来. 不过慢慢看下 ...

  5. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档

    java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档 java计算机毕业设计慧学IT精品课程 ...

  6. Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

    提供职业教育.企业培训.知识付费系统搭建服务.系统功能包含:录播课.直播课.题库.营销.公司组织架构.员工入职培训等. 提供私有化部署,免费售后,专业技术指导,支持PC.APP.H5.小程序多终端同步 ...

  7. spring-boot-2.0.3之quartz集成,数据源问题,源码探究

    前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...

  8. 【2021软件创新实验室暑假集训】SpringMVC框架(设计原理、简单使用、源码探究)

    系列文章目录 20级 Java篇 [2021软件创新实验室暑假集训]计算机的起源与大致原理 [2021软件创新实验室暑假集训]Java基础(一) [2021软件创新实验室暑假集训]Java基础(二) ...

  9. 实际测试例子+源码分析的方式解剖MyBatis缓存的概念

    前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...

最新文章

  1. Jittor 的Op, Var算子
  2. Paint滤镜效果实现
  3. 零基础python入门书籍推荐书目_铁粉看过来!送书啦,Python推荐书单,送书10本!...
  4. 一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗...
  5. androidsdk里的android.bat和uiautomatorview.bat启动就闪退问题
  6. SpringMVC总结帖
  7. [Java基础]字节缓冲流
  8. flink检查点简单理解
  9. js面向对象的程序设计 --- 上篇(理解对象)
  10. tensorflow之get_shape
  11. 如何调用WebService
  12. vlan端口隔离配置
  13. python turtle绘制漫天雪花
  14. java文字生成水印图片
  15. 为什么局部下降最快的方向就是梯度的负方向?
  16. 知识图谱及其关键技术
  17. 微信新BUG曝光:好友偷偷删了你,用这招就能查出来!
  18. 【数值计算】花式解线性方程组
  19. 2019_IJCAI_Deep Adversarial Social Recommendation
  20. 使用pygame开发一个小游戏

热门文章

  1. 如何成为SAP行业专家
  2. ABAP股票查看代码
  3. SAP HR信息类型
  4. 融合BI+AI,新一代增强型数据分析让制造企业高效解决故障预测分析问题
  5. php 中curd表达啥,CURD语句的基本语法和PDO中操作数据表的基本步骤实例演示增删改查命令 2019年07月24日 23时10分...
  6. 医学计算机应用第五版题库,医科医学计算机应用题库
  7. vb不能插入png图片_第16节-图片 | 剑雨Axure RP9系列「基础」
  8. postman安装报错 无法定位_VS2010 + winxp 无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上 错误...
  9. SQL语言之DDL语言学习-----数据定义语言学习
  10. python基础:try...except...的详细用法