配置加载过程
开头先贴上一个mybatis-config.xml文件的简略版以供参考

1.1config对象的一些属性
在解析过程中,所有的配置最终都会被加载到config类中,这个类包含了所有的配置信息,之后执行的一切sql或者读取的配置信息都需要config对象来获取,因此我们需要先来了解一下config对象中的一些属性。
cacheEnabled表示是否启用缓存,可以看到默认为true,这个属性可以证明MyBatis的缓存是默认启动的。

lazyLoadingEnabled延迟加载也同理

typeAliasRegistry别名注册器,这个对象的构造方法中包含MyBatis中内置的别名以及这些别名的类对象,十分重要。下图贴出的是别名注册器无参构造方法中的一些别名。


下面这些是关于sql语句以及数据源的配置,可以看到这些都是通过map表来存储的,红线出可以看到用的并不是Java自带的Map,StrictMap是MyBatis对HashMap继承后的静态内部类,相较于HashMap来说它更严格,不允许多次覆盖key所对应的value.

静态内部类StrictMap,其中有一个name属性,来表示这个map存储的是什么数据

可以看到相较于HashMap,StrictMap在放入元素前会先判断下是否已经存在这个key,如果有直接报错,表示StrictMap不允许对key进行覆盖和替换

1.2SqlSessionFactoryBuilder
MyBatis加载需要通过SqlSessionFactoryBuilder对象构建出一个SqlSessionFactory对象,这个对象应该是单例的,全局可用。MyBatis配置的加载就从这个build方法开始。

在build方法中,它通过一个XMLConfigBuilder对象来解析XML文件中的配置

1.3XMLConfigBuilder
在parse方法中,仅一个判断是否解析过的逻辑便进入parseConfiguration方法中,这里才是真正的解析方法。可以看到这里面依次对配置文件中的各种标签都分开进行解析,我们重点关注数据源和映射文件的解析过程。

1.3.1数据源解析过程
数据源的解析主要在environmentsElement()方法中,进入这个方法可以看到主要分为两步,对事务管理器的解析和数据源的解析

事务管理器分为JDBC和cjlib两种,通过解析type属性获取,然后再通过resolveClass来构建事务工厂。
MyBatis中内置了许多别名,都通过别名注册器的构造方法来加载,resolveClass的主要作用是通过别名来获取类对象,在源码中会大量使用到。

数据源的解析与事务管理器大同小异,不过数据源由于有多个属性,就通过getChildrenAsProperties()方法来解析name和value生成properties对象,最后通过数据源工厂对象的setProperties()方法来加载驱动


1.3.2映射文件解析过程
映射文件的解析主要在mapperElement()方法中,同样的,由于它下面可能有多个mapper标签,因此先通过for循环来循环解析,然后加载resource属性,获取流对象后通过XMLMapperBuilder对象来解析mapper文件。

1.4XMLMapperBuilder
先贴一个mapper.xml文件,以供参考

XMLMapperBuilder专门负责mapper映射文件的解析,构建XMLMapperBuilder后调用parse()方法来进行解析,在这个方法中除了解析外,和XMLConfigBuilder相比,还多了一个绑定映射器到namespace的过程,这两步可以分开说

1.4.1mapper解析
仅看第七步解析select标签的过程

经过一系列跳转后它进入了buildStatementFromContext方法中,这里通过一个XMLStatementBuilder对象来进行构建,在statementParser.parseStatementNode()方法中,解析完所有的属性后,在方法的最后它调用了一个助手类,将所有的配置都通过它来加载,在这个助手类的方法中,他通过建造者模式来构建MappedStatement对象,并放在configuration中。



1.4.2绑定映射器
如下代码

1.4.3助手类的作用
在mapper的解析过程中突然多了一个MapperBuilderAssistant助手类,这个类有什么作用呢?从源码来看,配置的加载过程就是一个Builder对象传递到另一个Builder分步进行解析,最后都汇总到configuration中的过程。这些Builder类都有一个父类,抽象类BaseBuilder,他规定了一些基础的解析方法,其他所有的Builder都继承他并加以扩充改造,MapperBuilderAssistant同样也继承了BaseBuilder父类,他和XMLMapperBuilder对象相互合作,XMLMapperBuilder负责解析XML文件,MapperBuilderAssistant负责处理解析出的数据,帮助XMLMapperBuilder将解析出的sql、namespace数据封装后存储到configuration当中。
至此粗略将MyBatis配置的解析过程粗略的梳理了一遍,这里仅针对一些重要的配置做了详细解释,其他部分基本都是这个模式,builder对象解析,然后构建出具体的类,然后放到configuration当中,仅供参考。
本文详细解析了MyBatis的配置加载过程,包括config对象属性、SqlSessionFactoryBuilder、XMLConfigBuilder的解析方法,特别是数据源解析和映射文件解析的步骤。在数据源解析中,涉及事务管理器和数据源工厂的构建,而在映射文件解析中,解析mapper标签并绑定到namespace。整个配置加载过程中,Builder对象如XMLMapperBuilder和MapperBuilderAssistant协同工作,将配置信息存储到configuration中。
492

被折叠的 条评论
为什么被折叠?



