【mybatis源码分析(一)】mybatis扫描xml解析的过程

环境使用springboot 

 

1、从MybatisAutoConfiguration自动装配类开始,可以看到创建了一个SqlSessionFactoryBean,经过了一系列填充属性操作,其中包含configuration配置类的属性填充,

n最后执行getObject方法获取到SqlSessionFactory类型的bean

configuration配置类的属性填充:就是我们在配置文件中的如下配置,会由springboot绑定到MybatisProperties类中

然后MybatisProperties类的configuration属性被放入SqlSessionFactoryBean的configuration属性

 

2、进入getObject方法,可以看到当sqlSessionFactory还没有初始化时,先调用afterPropertiesSet方法初始化

3、再进入buildSqlSessionFactory方法,在这里进行SqlSessionFactory的构建

可以看出第一步时配置了configuration属性,所以就会直接走if。

我们也可以不配置mybatis.configuration.xxx=xxx配置,而使用xml的文件配置方式,只需要设置mybatis.config-location=c:/mybatis-config.xml。那将会使用XMLConfigBuilder类去解析你的config xml。

注意:configuration的优先级大于config xml。

baseBuilder抽象类的实现如下:

  • XMLConfigBuilder是用来解析config xml的
  • XMLMapperBuilder是用来解析Mapper xml的
  • XMLStatementBuilder是用来解析Mapper xml中的select|insert|update|delete标签的
  • XMLScriptBuilder用来解析select|insert|update|delete标签内的if|foreach|trim|where|choose|when|otherwise|bind等标签的
  • SqlSourceBuilder用来解析sql的,比如替换#{id}
  • MapperBuilderAssistant用来协助构建Configuration的。比如:把Mapper(statment、cache等)的信息配置到Configuration
 

4、解析完了configuration,下一步该解析Mapper了,使用XMLMapperBuilder类

XPathParser类其实是对jdk的Document、XPath等类的封装

5、进入XMLMapperBuilder的parse方法,通过方法名可以看出,先配置/mapper元素,再绑定命名空间,再解析ResultMap、CacheRefs、Statements等元素

6、configurationElement方法上一步通过XPathParser解析/mapper元素为XNode,继续向下解析元素,例如:cache-ref、cache、resultMap、select|insert|update|delete等

7、进入buildStatementFromContext方法,开始构建XMLStatementBuilder用于解析select|insert|update|delete标签

8、解析完成最终通过MapperBuilderAssistant把配置添加进了configurtion

9、回到第7步sqlSessionFactoryBuilder.build方法通过Configuration构建DefaultSqlSessionFactory对象

10、回到第一步把返回的SqlSessionFactory对象放入spring容器

 

以上是springboot整合mybaits的xml全部解析过程

其他的xml元素解析类似,都是解析成XNode,然后最终通过MapperBuilderAssistant把配置添加进了configurtion

 

mybatis dao代理对象的注入与使用底层流程参考:https://blog.csdn.net/sumengnan/article/details/113953507

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值