type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

📝 题记

对于配置文件的解析, 还是相对比较好理解的, 就是读取配置文件, 然后在代码需要的地方给使用到.
这里,可以扩展下, Spring / SpringBoot 等是怎么读取配置文件呢 ? 并且配置文件还是有 xml / properties/yaml 等格式的 , 其读取代码是怎么写的 ? 然后基于 阿波罗(携程开源) 的配置中心 , 其实现配置又是怎么实现的呢 ? 然后这里,看了 Mybatis 读取配置文件, 后续再出 Spring 配置文件的时候,如果二者读取配置进行对比, 你个人更倾向使用代码呢 ?
所以,这里就开启读取 Mybatis 是如何解析配置文件的操作.

配置文件

这里的配置文件解读,是根据 MyBatis官网来一步一步的解析阅读. 如果有官网没有涉及到的,发现了也会在后续加上去的. 解析多行代码, 才能理解 何为优秀.

标签一 : properties

org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration —> propertiesElement(root.evalNode(“properties”)) 方法中来

标签二 : settings

这是 MyBatis对 settings 的操作.
具体的 settings 中每项配置参考官网链接 : https://mybatis.org/mybatis-3/configuration.html#properties
settingsAsProperties 方法
可以看到, 该方法就是进行加载,转化为key/value键值对类型, 然后对其key检验是否在
Configuration 中都有 set 方法.
Notes : 为了验证下, 我们加上一个没有的标签, 可以看到下面的异常. 所以我们看到这种异常的时候,是可以去检查下是不是名字什么有问题.
Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: The setting nnnnn is not known. Make sure you spelled it correctly (case sensitive).
loadCustomVfs(settings) 方法
该方法,主要就是读取 vfsImpl 对用的value,切割下,然后用 classForName 来获取 class,
最后赋值到 configuration 中去. 这里算是对 vfs 的一种自定义的扩展,虽然目前还不太清楚vfs具体作用.
 
loadCustomLogImpl(settings) 方法
 

标签三 : 关于别名的配置.

 

标签四:扩展

扩展的 demo 可以参考 MyBatis官网 : https://mybatis.org/mybatis-3/configuration.html
然后看 MyBatis 是如何将插件给利用上的呢 ?
首先在 mybatis-config.xml 中配置好我们自己定义的 plugin
这里以我配置了二个插件
// 处理 plugin 的代码
可以看到 MyBatis在加载plugin的时候,是利用了反射来new出一个对象来,并且注册到 typeAliasRegistry 中来. 这里主要是解析 plugin 的配置, 后面在执行sql的时候,都是如何使用到这些 plugin 的呢 ? 肯定是有一个从InterceptorChain中获取interceptors来,然后进行处理.
 

标签五 : < objectFactory >

objectFactory 的处理方式是和 标签四相似的,只是最后在使用场景是有点不同的.
代码上的操作也是类似的.
 
该标签在 MyBatis 官网是没有demo, 我是根据代码来顺藤摸瓜写的一个.
参考 : org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory 这个源码,来模仿写的一个.
 

标签六 : < reflectorFactory >

处理方式和上面类似.
这里我们自己写一个 com.iyang.mybatis.factory.GavinReflectorFactory 来继承DefaultReflectorFactory,在无参数构造函数中打印下内容, 然后debug跟进.
 

标签七:environments

environments 标签都是放入一些 db 的配置信息等.
解析 environments ,利用 typeAliasRegistry 中已经注册好了的信息,然后根据名字缩写(比如JDBC)这种,来获取class对象, 用 反射来 new 一波对象出来,真是美滋滋. 接着就是解析 事务/JDBC连接配置信息等, 最后将信息保存到 DataSource 中来. 反手再来一波 链式编程 来new对象出来, 最后就是一个 Environment 对象出来,给set 到 configuration 中来.
 

标签八: handler

 
到这里,可以看到对xml的解析操作. 先解析 标签 的值出来,然后根据值进行分类处理或者根据自己的需求来进行处理.
 

标签九

该标签是对我们对应的对象,其sql语句存放的地址. 也就是里面放入的是于mapper接口对应的方法,查询的sql语句.
接下来看下 MyBatis 是对 mappers 标签的内容进行了说明解析和处理.
 

🤗 总结归纳

📎 参考文章

 
💡
有关文章的问题,欢迎您在底部评论区留言,一起交流~