Configuration配置体系

Configuration概述

Configuration 是整个MyBatis的配置体系集中管理中心,前面所学Executor、StatementHandler、Cache、MappedStatement...等绝大部分组件都是由它直接或间接的创建和管理。此外影响这些组件行为的属性配置也是由它进行保存和维护。如cacheEnabled、lazyLoadingEnabled ... 等。所以说它MyBatis的大管家很形象。

核心作用总结

总结一下Configuration主要作用如下:

  • 存储全局配置信息,其来源于settings(设置)
  • 初始化并维护全局基础组件 
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • plugins(插件)
  • environments(环境配置)
  • cache(二级缓存空间)
  • 初始化并维护MappedStatement
  • 组件构造器,并基于插件进行增强
  • newExecutor(执行器)
  • newStatementHandler(JDBC处理器)
  • newResultSetHandler(结果集处理器)
  • newParameterHandler(参数处理器)

配置来源

Configuration 配置来源有三项:

  1. Mybatis-config.xml 启动文件,全局配置、全局组件都是来源于此。
  2. Mapper.xml SQL映射(MappedStatement) \结果集映射(ResultMapper)都来源于此。
  3. @Annotation SQL映射与结果集映射的另一种表达形式。

配置RedisSsson Spring 配置英文_结果集

配置元素

Configuration 配置信息来源于xml和注解,每个文件和注解都是由若干个配置元素组成,并呈现嵌套关系,总体关系如下图所示:

配置RedisSsson Spring 配置英文_xml_02

关于各配置的使用请参见官网给出文档:https://mybatis.org/mybatis-3/zh/configuration.html#properties

元素承载

无论是xml 还是我注解这些配置元素最弱都要被转换成JAVA配置属性或对象组件来承载。其对应关系如下:

  1. 全配置(config.xml) 由Configuration对像属性承载
  2. sql映射<select|insert...> 或@Select 等由MappedStatement对象承载
  3. 缓存<cache..> 或@CacheNamespace 由Cache对象承载
  4. 结果集映射 由ResultMap 对象承载

配置RedisSsson Spring 配置英文_xml_03

配置文件解析

配置文件解析需要我们分开讨论,首先来分析XML解析过程。xml配置解析其底层使用dom4j先解析成一棵节点树,然后根据不同的节点类型与去匹配不同的解析器。最终解析成特定组件。

解析器的基类是BaseBuilder 其内部包含全局的configuration 对象,这么做的用意是所有要解析的组件最后都要集中归属至configuration。接下来了解一下每个解析器的作用:

  • XMLConfigBuilder :解析config.xml文件,会直接创建一个configuration对象,用于解析全局配置 。
  • XMLMapperBuilder :解析Mapper.xml文件,内容包含 等
  • MapperBuilderAssistant:Mapper.xml解析辅助,在一个Mapper.xml中Cache是对Statement(sql声明)共享的,共享组件的分配即由该解析实现。
  • XMLStatementBuilder:SQL映射解析 即<select|update|insert|delete> 元素解析成MapperStatement。
  • SqlSourceBuilder:Sql数据源解析,将声明的SQL解析可执行的SQL。
  • XMLScriptBuilder:解析动态SQL数据源当中所设置 SqlNode脚本集。

配置RedisSsson Spring 配置英文_SQL_04

XML文件解析流程

整体解析流程是从XmlConfigBuilder 开始,然后逐步向内解析,直到解析完所有节点。我们通过一个MappedStatement 解析过程即可了解到期整体解析流程。

配置RedisSsson Spring 配置英文_结果集

流程说明:

  1. 【XmlConfigBuilder】 接收一个config.xml 输入流,然后创建一个空Configuration对象
  2. 【XmlConfigBuilder】解析全局配置
  3. 【XmlConfigBuilder】mapperElements解析,通过Resource或url 指定mapper.xml文件
  1. 【XmlMapperBuilder】解析缓存、结果集配置等公共配置
  2. 【XmlMapperBuilder】解析Sql映射<select|insert|upate|delete> 
  1. 【XMLScriptBuilder】解析生成SQL数据源,包括动态脚本
  1. 【XmlMapperBuilder】构建Statement
  1. 【MapperBuilderAssistant】设置缓存并添加至Configuration 

注解配置解析

注解解析底层实现是通过反射获取Mapper接口当中注解元素实现。有两种方式一种是直接指定接口名,一种是指定包名然后自动扫描包下所有的接口类。这些逻辑均由Mapper注册器(MapperRegistry)实现。其接收一个接口类参数,并基于该参数创建针对该接口的动态代理工厂,然后解析内部方法注解生成每个MapperStatement 最后添加至Configuration 完成解析。

配置RedisSsson Spring 配置英文_xml_06