乐趣区

MyBatis源码解析(一) Configuration 初始化

1 完成前置条件
Configuration 初始化首先需要了解 DataSource、TransactionFactory、Environment;
1.1 javax.sql.DataSource
数据源配置,通常使用第三方数据池作为数据源,如 Druid 等。数据池推荐帖【JAVA 数据源】
1.2 org.apache.ibatis.transaction.TransactionFactory
MYbatis 提供了 org.apache.ibatis.transaction 实现事务管理在 transaction 包下提供了 2 个接口 TransactionFactory,Transaction

TransactionFactory 通过工厂设计模式返回 Transaction 实例,
Transaction 对 Connection 进行了封装,提供了获取连接,提交,回滚,关闭等方法

Mybatis 提供了两种实现方式

org.apache.ibatis.transaction.jdbc    基于 JDBC 实现事务管理
org.apache.ibatis.transaction.managed    扩展,通过整合第三方框架实现事务管理

推荐帖【Transaction 事务模块】
1.3 org.apache.ibatis.mapping.Environment
Environment 类比较简单,只记录了 id,并依赖于 TransactionFactory 和 Datasource。
1.4 org.apache.ibatis.session.Configuration
可以这么说,MyBatis 初始化的过程,就是创建 Configuration 对象的过程 MyBatis 通常通过两种方式初始化 Configuration

XML 配置
API 构建

1.4.1 XML 配置
MyBatis 主要通过下例三个类实现 XML 解析

org.apache.ibatis.builder.xml.XMLMapperEntityResolver    获取本地 dtd,避免从网络获取
org.apache.ibatis.parsing.XPathParser    解析 XML->Document, 获取 XNode 实例
org.apache.ibatis.parsing.XNode    获取子孙节点及节点属性

XPathParser 负责 Document 实例化,以及获取子节点

初始化 Document —-> XPathParser.createDocument(inputSource)javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputSource)
获取子节点 XNode —-> XPathParser.evalNode(expression)javax.xml.xpath.XPathFactory.newInstance().newXPath().evaluate(expression, root, returnType) 并将子节点封装成 XNode 实例,且 XNode 获取子节点还是通过 XPathParser 实现的。

最后 MyBatis 通过 org.apache.ibatis.builder.xml.XMLConfigBuilder 完成 Configuration 初始化 —-> XMLConfigBuilder.parse()
1.4.2 API 构建

构建 DataSource
构建 Environment
构建 Configuration

退出移动版