这篇博客主要是来分析MyBatis与Spring集成后Spring帮我们做了哪些事情,以及集成后使用MyBatis有什么变化。
首先来看看集成包下有什么东西吧。
第一个模块annotation:这里做了一个注解(MapperScan),用于扫描mapper。以及mapper扫描注册器(MapperScannerRegistrar),此扫描注册器实现了ImportBeanDefinitionRegistrar接口,在Spring容器启动时会运行所有实现了这个接口的实现类,而这个注册器内部会注册一系列MyBatis的信息。
第二个模块batch:这里没有深入研究这个包,估计是为了批量操作使用的?
第三个模块config:主要是为了解析处理读取到的配置信息。
第四个模块mapper:这里就是主要处理mapper的地方了,与编程式的MyBatis不同,与Spring集成后,每个mapper本来的生命周期为method级别,在集成后变成了application级别,主要原因是Spring将扫描到的每一个mapper都存入IOC容器,并且是单例的。
我们进入ClassPathMapperScanner的doScan方法DEBUG来看一下。
这里可以看到,所有的mapper都会被放入IOC容器,并且scope=singleton,生命周期提升至容器级别,所以我们在用的时候只需要使用注解@Autowired即可使用Mapper。
第五个模块support:只有一个模板辅助类,是MapperFactoryBean的父类,用于方便创建一个SqlSession(集成后的SqlSession变成了SqlSessionTemplate,下面会介绍)
第六个模块transaction:在集成后,事务的管理交给了Spring来做。
最后一个就是SqlSession的变化了,先来DEBUG看看集成后的mapper是个什么东西吧。
这里我随意启动了一个Service层,debug了一个mapper的属性,可以看到,它还是一个熟悉的MapperProxy代理的,但不同点在于MapperProxy中的sqlSession,这里再也不是DefaultsqlSession了,而是一个SqlSessionTemplate,那这个到底是什么呢?
public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,
PersistenceExceptionTranslator exceptionTranslator) {
notNull(sqlSessionFactory, "Property 'sqlSessionFactory' is required");
notNull(exec