能够这么说,MyBatis初始化的过程,就是建立Configuration对象的过程。html
顾名思义,Configuration表示配置,该对象中维护了不少mybatis的配置参数。
大体可分为四部分:mysql
经过查看org.apache.ibatis.mapping.Environment的源码。
Environment仅维护了一个id,TransactionFactory以及DataSource。sql
Configuration提供了一些默认配置参数,并可经过get/set方法去修改参数值。
如mapUnderscoreToCamelCase,cacheEnabled等。apache
Configuration维护了不少缓存容器,如caches、resultMaps等,暂未深究设计模式
Configuration提供了InterceptorChain插件责任链,并对Mybatis的四大核心组件(Executor除外)进行拦截缓存
除了插件以外,其余还有一些mapperRegistry用于注册Mapper等,暂未深究网络
Mybatis提供了两种方式初始化Configurationmybatis
// 构建数据源,此处使用了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);
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配置结构图
资料来源:MyBatis3 XML配置
最后,在结尾总结一下Configuration初始化时涉及的设计模式工厂模式:TransactionFactory动态代理模式:InterceptorChain 此处名称采用了责任链,其实是经过Plugin动态代理嵌套实现。