mybatis执行流程分析
后端
配置加载
通过 XMLConfigBuilder.parse
解析configuration.xml
和 mapper.xml
生成org.apache.ibatis.session.Configuration
,生成 SqlSessionFactory
在生成Configuration
的过程,通过XMLMapperBuilder.parse
-> XMLStatementBuilder.parseStatementNode
-> XMLLanguageDriver.createSqlSource
-> XMLScriptBuilder.parseDynamicTags
-> Configuration.addMappedStatement
解析sql语句标签,生成对应的MappedStatement
对象,以id 作为key 放在 Configuration 的mappedStatements的map 中。
mapper对象的注册
MapperScan
注解引入了 MapperScannerRegistrar
的bean
MapperScannerRegistrar
实现了接口 ImportBeanDefinitionRegistrar.registerBeanDefinitions
,注册了MapperScannerConfigurer 的bean
MapperScannerConfigurer
实现了 BeanDefinitionRegistryPostProcessor
接口,扫描mapper 包
类 ClassPathMapperScanner
覆盖了 ClassPathBeanDefinitionScanner
的 doScan
方法,扫描mapper接口并配置其生成bean的工厂bean
checkDaoConfig
方法会在bean初始化后在afterPropertiesSet
里被调用,实际上是调用 MapperRegistry.addMapper
,添加代理工厂MapperProxyFactory
MapperFactoryBean.getObject
调用 MapperRegistry.getMapper
,最后通过 MapperProxyFactory
创建MapperProxy
Mapper 接口的代理对象 MapperProxy
,通过 MapperMethod
调用 SqlSessionTemplate
-> SqlSessionInterceptor
-> sqlSession
执行sql
Sql 执行