mybatis初始化分析一
1:读取mybatis配置文件
根据 XMLConfigBuilder 解析配置的xml文件,读取配置参数,并将读取的参数存入Configuration 类中,几乎所有的mybatis配置都是存储在这里的。
2:初始化 SqlSessionFactory
使用上一步中构建好的 Configuration 对象去初始化SqlSessionFactory。在 mybatis中SqlSessionFactory是一个接口,其默认实现类为 DefaultSqlSessionFactory
以上创建的方式就是 Builder 模式,适用于复杂对象的创建,如果不采用Builder模式,会导致大量复杂的逻辑存在于构造方法中。而采用了Builder模式,我们可以分步骤的一步步有序的来创建它,从而降低其初始化的复杂性,值得在工作中学习。
3:关键性Configuration对象初始化分析
1
2
3
4
我们直到以上是构建Configuration实例的关键源码,其中基本原理就是解析xml配置文件,去初始化Configuration对象的各个属性值,比如Settings的设置,enviroment环境的配置(一个环境代表一个数据源的连接,其中有根据TransactionManager 的type属性去mybatis的默认提供的别名中去查找对应的类型利用反射的方式去实例化数据库事物采用的方式,JDBC作为TYPE会初始化JdbcTrancactionFactory类实例);plugin插件,mapper映射器的注册,数据库标识,typeHandler类型处理器,typeAliases别名,以及properties全局参数等等属性的初始化工作。
4:映射器
映射器的解析过程十分复杂,初始化流程则相对简单,下面先分析一下mybatis如何对映射器进行初始化的,我们直到映射器也是属于Configuration的属性之一,其在Configuration初始化的时候就已经注册完成了,一下分析映射器的扫描流程:
5 6以上会根据xml配置文件中采用不同的映射器定义方式去区别处理,下面分析第一种,<package name = "">的方式定义,继续往下走...
这里的Mapper映射器初始化,需要用到mybatis中的 MapperRegistry 类
该类有两个属性,两个方法:
Configuration :众所周知的配置类哈
HashMap<Class<?> , MapperProxyFactory<?>> knownMappers:这里的一个hashmap用于存储
getMapper <Class<T> type>方法和 addMappers 方法。
addMappers方法最终执行的是在Configuration类中的mapperRegistry属性中,去根据该xml定义的mapper包中的所有接口Mapper循环调用MapperRegistry的addMapper(Class<T> type)去处理每一个映射器
7 8 9 10注册完成映射器就是解析映射器描述文件了,即XXXMapper.xml文件
MapperAnnotationBuilder parse = new MapperAnnotationBuilder(this.config, type);
parse.parse();
11重点看一下parse()方法,在该方法中主要就是根据映射器的class定义,将.转为 '/' 并找到对应的xml文件,
12首先判断是否已经加载过该映射器的描述文件了,加载过的就不在加载了。
没有加载过的就采用xmlMapperBuilder建造者去解析xml中的元素。
13 14重点看一下最后的buildStatementFromContext方法,遍历解析增删改查节点,并创建每一个statement对象,
15 16 17 18 11mapper初始化好了之后,就是根据sqlsession.getMapper(Class mapper),去获取Mapper映射器了
下一篇文章分析如何获取利用DefaultSqlSessionFactory去获取sqlSession