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

能够这么说,MyBatis初始化的过程,就是建立Configuration对象的过程。html

1 Configuration介绍

顾名思义,Configuration表示配置,该对象中维护了不少mybatis的配置参数。
大体可分为四部分:mysql

  1. 环境变量(Environment)
  2. 配置参数
  3. 缓存集合
  4. 插件及其余

1.1 环境变量(Environment)

经过查看org.apache.ibatis.mapping.Environment的源码。
Environment仅维护了一个id,TransactionFactory以及DataSource。sql

  1. id environment的惟一标识,如dev,prod等
  2. TransactionFactory 事务工厂,负责事务管理,Mybatis提供了两套事务管理
    2.1 org.apache.ibatis.transaction.jdbc 基于JDBC实现事务管理
    2.2 org.apache.ibatis.transaction.managed 用于扩展第三方事务管理
    推荐帖【Transaction事务模块】
  3. DataSource 数据源
    推荐帖【JAVA数据源】

1.2 配置参数

Configuration提供了一些默认配置参数,并可经过get/set方法去修改参数值。
如mapUnderscoreToCamelCase,cacheEnabled等。apache

1.3 缓存集合

Configuration维护了不少缓存容器,如caches、resultMaps等,暂未深究设计模式

1.4 插件及其余

Configuration提供了InterceptorChain插件责任链,并对Mybatis的四大核心组件(Executor除外)进行拦截缓存

  1. 执行器 Executor
  2. StatementHandler
  3. ParameterHandler
  4. ResultSetHandler
    推荐帖【MyBatis插件原理】 共有五篇,PageHelper就是基于插件实现的。

除了插件以外,其余还有一些mapperRegistry用于注册Mapper等,暂未深究网络

2 Configuration初始化

Mybatis提供了两种方式初始化Configurationmybatis

2.1 API构建

// 构建数据源,此处使用了Mybatis的PooledDataSource, 一般采用第三方数据源,如Druid
    PooledDataSource dataSource= new PooledDataSource();
    dataSource.setDriver("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://xxxx:3306/test");
    dataSource.setUsername("username");
    dataSource.setPassword("password");

    
    // 构建环境 并将其标识为dev
    Environment dev = new Environment("dev", new JdbcTransactionFactory(), dataSource);
    
    // 构建Configuration
     Configuration config= new Configuration(dev);

2.2 XML构建

MyBatis提供XMLConfigBuilder经过XML构建Configuration。app

而MyBatis解析XML主要经过如下三个类:
2.1 XMLMapperEntityResolver
    获取XML本地dtd,避免从网络获取
2.2 XPathParser
    解析XML为Document对象,可获取子节点
    封装细节:
        2.2.1 获取Document -> createDocument()
            DocumentBuilderFactory.newInstance().newDocumentBuilder().parse()
        2.2.2 获取子节点XNode及其余类型子节点 -> evalXX()..
            xpath.evaluate() //xpath由XPathParser初始化时建立 -> XPathFactory.newInstance().newXPath()
2.3 XNode
    XNode 对Node以及XPathParser进行了封装,可获取子节点及节点属性
        2.3.1 获取子节点 -> evalXX()
            在2.2.2中说明了XPathParser经过xpath.evaluate 获取Node节点,并返回XNode(实际是对Node以及XPathParser进行了封装)
            而XNode获取子节点实际仍是经过XPathParser获取。
        2.3.2 获取节点属性 -> getXXAttribute()
            XNode初始化时,经过Node获取节点属性,并解析为Properties类型,提供属性获取。
MyBatis实际上经过XPathParser和XNode封装了经过DocumentBuilder解析XML为Document,以及经过XPath解析节点属性的过程。

XMLConfigbuilder则经过XPathParser和XNode获取XML的配置属性,
实现了Configuration的初始化(实现方法:XMlConfigBuilder.parseConfiguration)ui

贴一张 MyBatis3 的XML配置结构图

clipboard.png

资料来源:MyBatis3 XML配置

最后,在结尾总结一下Configuration初始化时涉及的设计模式工厂模式:TransactionFactory动态代理模式:InterceptorChain 此处名称采用了责任链,其实是经过Plugin动态代理嵌套实现。

相关文章
相关标签/搜索