一.配置信息解析过程:
调用SqlSessionFactoryBuilder的build()方法,利用XMLConfiguration方法里的parseConfiguration方法解析相关的配置。inputStream流是mybatis-config.xml配置对应的字节流。
XMLConfigBuilder的parse()方法解析mybatis-config.xml节点得到Configuration配置类。
简单总结一下这里:parseConfiguration完成是解析configuration下的所有标签,主要包括enviroment,mappper接口,别名等信息。
接下来我们来看myabtis是如何解析enviroment标签内容的:
主要看enviromentElement()方法里的dataSourceElement()方法,主要是解析出dataSource标签内配置的四个properties属性,并封装成Properties对象,赋值给DataSouceFactory,返回DataSouceFactory对象。最后将环境信息读取后存放在Confiuartion变量中。
二.Mapper接口解析过程:
对mapper接口的解析,看XMLConfigBuilder的mapperElement()。里面主要还是调用了XMLConfigBuilder的parse方法。这里使用了构建者模式。
pase方法里主要干了两件事:
1.调用了configurationElement()来对具体的mapper子标签进行解析;
2.调用bindMapperForNamespace()方法进行mapper接口与XML的绑定。其中这个方法很重要,MapperedStatement对象就是在这里创建的。
bindMapperForNamespace()方法里又调用了buildStatementFromContext()方法,该方法里的statementParse.parseStatementNode()才是具体解析增删改查的方法。在parseStatementNode()最后,调用了addMapperStatement(),所以呢,上面说了MapperStatement就是在这里创建的。MapperStatements里就是存放了具体的sql信息。他其实就是一个Map<String,MappedStatement>,他也是configuration类的一个成员属性。
为什么要用map呢?答:从mapperStatements根据【namespace+方法名称】作为key,从mapperStatements中获取到MapperStatement对象,进而拿到对应的sql信息,就能执行sql了。
三:Mapper接口与MapperProxyFactory的绑定过程:
上面也提到了这个方法bindMapperForNamespace(),看看他的源码:
这个方法里最主要的还是调用了configuration.addMapper()方法。这里面将mapper接口作为key,存入knowMappers中。
好了,大体总结一下:最终是将Configuration作为参数构建出了DefautSqlSessionFactory对象。