Spring之整合Mybatis底层源码流程
2022-10-15 15:20:17 0 举报
Spring整合Mybatis底层流程源码
作者其他创作
大纲/内容
调用MapperScannerRegistrar类中的registerBeanDefinitions方法
SQL执行流程
重写isCandidateComponent方法使接口可以生成beanDefinition
生成beanDefinition
重写doScan方法
synchronizations.get()
把BeanClass修改为MapperFactoryBea把AutowireMode修改为byType
判断事务是否开启
拿到MapperScan注解的值进行赋值给MapperScannerConfigurer
进行扫描
SqlSessionFactoryBean#afterPropertiesSetSqlSessionFactoryBean#buildSqlSessionFactory
相当于每个Mapper对应一个FactoryBean
调用代理对象的invoke方法
会把SqlSessionFactoryBean中所设置的DataSource对象作key,去上面提到的map中拿到对应的由事务管理器所创建好的数据库连接
MapperFactoryBean#getObject
通过@MapperScan导入了MapperScannerRegistrar类
开启事务
SqlSessionTemplate#getMapper
利用sqlSession对象来执行sql
会从Environment中拿到一个TransactionFactory对象,注意这个Environment对象是mybatis中的,不是Spring中,但是在SqlSessionFactoryBean的初始化逻辑中,会向Environment中添加一个SpringManagedTransactionFactory对象,所以此时调用该对象的new Transcation()方法得到一个SpringManagedTransaction
SqlSessionTemplate.SqlSessionInterceptor#invoke
spring启动
基于数据库连接执行sql
执行sql的适合就会执行代理对象的getObject方法
byType会主动调用set方法,所以Spring会自动调用set方法,有两个set方法,一个setSqlSessionFactory,一个setSqlSessionTemplate,而这两个方法执行的前提是根据方法参数类型能找到对应的bean,所以Spring容器中要存在SqlSessionFactory类型的bean或者SqlSessionTemplate类型的bean。
在后续的Mybatis源码中,就会调用SpringManagedTransaction的getConnection()方法得到一个数据库连接,会利用DataSourceUtils来获取由事务管理器所创建好的数据库连接
sqlSession为空
就会把数据库连接与事务管理器绑定一起#resources.set(map);
如果你定义的是一个SqlSessionFactory类型的bean那么最终也会被包装为一个SqlSessionTemplate对象,并且赋值给sqlSession属性#这里会初始化一个代理对象,代理逻辑SqlSessionInterceptor
创建bean
Spring与Mybatis整合流程
修改beanDefinition
DefaultSqlSessionFactory#openSession()
调用MapperScannerConfigurer的postProcessBeanDefinitionRegistry()方法
利用事务管理器创建一个数据库连接
SpringManagedTransaction#getConnection
生成ClassPathMapperScanner对象添加到includeFilter里
判断是否开启事务synchronizedWithTransaction
注册一个MapperScannerConfigurer类型的BeanDefinition
0 条评论
下一页