# 前言
在前两篇文章我们在 mybatis 源码中探究了他的运行原理,但在实际使用中,我们需要将其和Spring整合使用,特别是当下流行的SpringBoot,那么,myBatis 在 SpringBoot 中是如何运行的呢?
我们需要带着问题去研究,这样才能印象更深刻,以下是楼主的问题,不知道各位有没有自己的问题,如果有,也可以和楼主一起探讨,或者自己查看源码。
- SqlSessionFactory,SqlSession 如何生成?
- Mapper 代理如何生成?如何运行?
1. SqlSessionFactory,SqlSession 如何生成?
由于楼主的项目是SpringBoot ,因此基本没有配置文件,只有一个简单的配置,这也是Spring团队一直追求的目标:无配置。但由于我们的团队开始使用SpringCloud ,于是配置又多了起来,看来,配置文件始终是消灭不掉的。那么,废话了这么多,楼主的关于Mybatis的配置由以下几个部分组成:
- jar 包 maven导入artifactId 为 mybatis-spring 的jar包,该jar包是整合Spring和mybatis的粘合剂。
- 使用硬编码的方式配置bean。比如SqlSessionFactory,SqlSessionTemplate, PlatformTransactionManager.
- 扫描接口包。
配置 SqlSessionFactory
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource());
bean.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE);
// 添加插件
bean.setPlugins(MybatisUtil.getInterceptor());
// 添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
return bean.getObject();
}
注意:dataSource 方法会返回一个楼主自己配置的多数据源。但这不是我们今天的重点。
SqlSessionTemplate 配置
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
通过刚刚的 sqlSessionFactory 创建一个 SqlSessionTemplate ,该类非常重要,是Spring 和 Mybatis 整合的核心。稍后会详细介绍。
PlatformTransactionManager 事务管理配置
@Bean
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new DataSourceTransactionManager(dataSource());
}
注意:为什么这里会有一个重写注解,因为楼主这个类实现了 TransactionManagementConfigurer 接口,该接口是Spring的事务基础结构中的核心接口。应用程序可以直接使用它,但他并不作为主要API,通常,应用程序可以使用 TransactionTemplate 或通过AOP进行声明式事务划分。
可以看到,楼主在这三个方法上面都加入了@Bean 注解,表示这个方法会返回一个Bean。
还有就是如何扫描包 @MapperScan(basePackages = "cn.think.in.java.mapper")
,通过这个注解扫描需要生成代理的包名。
好了,我们开始一个个分析,首先看 SqlSessionFactory 如何生成,我们先看看我们写的代码,首先创建了一个 SqlSessionFactoryBean, 然后设置该Bean的数据源,再然后设置别名,再设置插件,再设置资源URL,最后调用getObject 方法返回一个SqlSessionFactory。我们看到了 getObject 方法,如果看过我们 Spring 源码解析系列文章,就知道,这式 Spring 扩展接口 FactoryBean 中一个非常重要的方法,其中有一种类型的AOP就是通过该接口实现的。我就不讲这个接口的原理了。那么,这个 SqlSessionFactoryBean 肯定实现了该接口,我们看看源码:
可以看到该类实现类 Spring 中几个重要的接口,比如 FactoryBean ,InitializingBean 接口。这对该类的拓展起到了非常大的作用。我们再看看该类有哪些属性:
可以看到该类俨然一个SqlSession,该