mybatis源码解读:builder构建者(一)

框架的配置

其实每一款优秀的框架都少不了对相对开放的配置这一块的解析,而配置如何能够读取到系统中并且生效,这也是每一款优秀的开源框架需要考虑的事,既要让配置灵动,又要它能够健壮到对系统不会造成损害,这对于框架研发人员来说是一种挑战,不过虽说如此也不要对框架有太多的畏惧之心,无论是xml的配置还是扫描注解这种方式其实都是开发人员自己定义的一个规则,或者是io资源就是读取解析或者是注解扫描,离不开这些的。
对于mybatis来说,如何让一段xml配置可以生效,其实就是常规的几步,通过io包下的resource去读取文件资源,然后通过builder包下的一群构建者来验证解析xml的标签,然后将解析好的资源放入到configuration这个全局上下文中供接下来的调用,如果是注解方式可能会有注解扫描。

构建者模式

在介绍builder包之前,需要简单介绍一下构建者模式,构建者模式其实就是对一个产品诞生的主要流程抽象化,对外部细节隐藏,让具体的一个构建类去实现,扩展功能,然后让其做一个指挥者,运用依赖倒置封装接口隔离,面向接口抽象编程,动态的调用这个方法功能,实现对复杂对象的创建解耦,加深代码的可读性可维护性。
具体的实现可以自行百度。

builder

builder包下的类是mybatis解析xml的核心,这些类都继承自 BaseBuilder,并且各自负责一块功能的解析,这样将复杂的xml解析这一块抽离开来,降低复杂性,mybatis在这一块的设计还是比较优雅的。
mybatis源码解读:builder构建者(一)_第1张图片
由上图可以看到,父类BaseBuilder下有好几层继承类,这些类负责了mybatis解析xml的大部分重要功能。

XMLConfigBuilder

XMLConfigBuilder 是 mybatis 解析配置文件很重要的一个类,也是最开始的一个类,几乎重要的逻辑都是在它内部完成的,它主要负责将xml配置文件读取进来并且根据定好的约定规则解析放入到全局configuration中以及注册handler处理器、registry注册器等。
它会处理诸如 properties settings plugins reflectorFactory mapper 等标签

XMLMapperBuilder

XMLMapperBuilder 也是 mybatis 中一个非常重要的类,mapper 标签是如何被解析的以及它是如何存储到内存中保证唯一并且正确的,这些都是 XMLMapperBuilder 做的事情。mybatis会将一个namespace下的所有配置信息解析并且存储在configuration中的对应的位置,比如cache-ref、cache、parameterMap、resultMap、sql等节点信息。

XMLStatementBuilder

XMLMapperBuilder更多的是对除sql之外的标签的处理,对于sql相关标签的处理是由XMLStatementBuilder来完成的,它处理的更加精细,主要是对 select insert update delete 标签的处理,它会将namespace下的CRUD相关的标签解析成为一个个mappedStatement,其中自然少不了对一些特殊的属性标签的检查,比如 databaseId、flushCache、resultOrdered、parameterType、lang、fetchSize 等等,当然解析完全的statement也会放入到configuration中

SqlSourceBuilder

顾名思义,SqlSourceBuilder主要就是对sql的解析校验,最直接的就是 #{} 这种占位符的替换成为 ?这种标准的prepareStatement语句,SqlSourceBuilder 是在运行时发挥作用的,他会根据你的CRUD
语句判断你是不是动态语句或者就是静态语句来执行不同的策略,如果是动态sql,可能会去找到include对应的sql拿进来或者是将 set 等标签进行解析

XMLScriptBuilder

XMLScriptBuilder内部封装了一个nodeMap,包括了对一些动态sql 的处理,比如等,会判断是不是动态sql,然后交给 SqlSourceBuilder 去处理。

整个builder的时序图

mybatis源码解读:builder构建者(一)_第2张图片

最终在 SqlSessionFactoryBuilder 这里会拿到构建完全的 SqlSessionFactory

你可能感兴趣的:(mybatis)