目录
2.1 processPropertyPlaceHolders
从学习Mybatis(7):Mybatis运行原理源码分析 其实可以知道Mybatis运行的原理,不难想象Spring整合Mybatis,就是依靠将SqlSessionFactory等组件封装为Bean来实现的。
这里还是根据学习Mybatis(4):结合Spring Boot的例子。
1.关键类的加载
Spring Boot使用Mybatis时,引入的是starter包,同时也会带进来一个autoconfigure依赖。就是该依赖完成的Mybatis自动配置。从spring.factories可以看出,其核心类是MybatisAutoConfiguration,这是一个InitializingBean。不过我们更关注的是两个方法和一个类:
- sqlSessionFactory(DataSource dataSource)
- sqlSessionTemplate(SqlSessionFactory sqlSessionFactory)
- MapperScannerRegistrarNotFoundConfiguration
前两个是方法,被@Bean注解,最后是内部类,会在没有加载MapperFactoryBean、MapperScannerConfigurer时加载,且Import另一个内部类AutoConfiguredMapperScannerRegistrar完成Mapper的扫描。
首先看第一个方法
1.1 SqlSessionFactory的加载
首先会创建一个SqlSessionFactoryBean,这是一个InitializingBean,也是FactoryBean。sqlSessionFactory方法的剩余部分就是将配置文件的配置值赋给SqlSessionFactoryBean,最后调用getObject()方法获得SqlSessionFactory对象。
实际调用了afterPropertiesSet方法,核心逻辑是调用buildSqlSessionFactory(),整个方法大概160行,所以不上源码了。
方法内通过一系列的if块,判断各属性是否为空,不为空则添加到Configuration对象中,最后和独立使用Mybatis时一样,调用sqlSessionFactoryBuilder.build(targetConfiguration)创建一个SqlSessionFactory对象。
这里的各属性其实就是mybatis_config.xml配置文件中的内容,如果是XML形式配置的Spring,也可以在注册SqlSessionFactoryBean时定义,不过在Spring Boot中,都是刚刚从properties或yaml文件中加载的。
在示例中,properties文件里有一条mybatis.mapper-locations配置会在经过解析后赋值给SqlSessionFactoryBean,结合学习Mybatis(7):Mybatis运行原理源码分析,可以看到在XMLMapperBuilder类中,会通过反射将mapper配置文件中namespace属性加载为类,并且通过Configuration#addMapper加载:
private void bindMapperForNamespace() {
String namespace = this.builderAssistant.getCurrentNamespace();
if (namespace