项目中整合了mybaitsplus的starter,该包下有一个MybatisPlusAutoConfiguration,是一个自动配置类,有一个创建SqlSessionFactory的方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_配置文件

首先创建了一个MybatisSqlSessionFactoryBean对象,设置dataSource对象到MybatisSqlSessionFactoryBean对象上,获取MybatisConfiguration对象,该
对象继承了mybatis的Configuration,接着调用MybatisSqlSessionFactoryBean的getObject方法获取SqlSessionFactory对象,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_java_02


该方法调用了buildSqlSessionFactory方法,该方法主要是判断是否设置了包的别名以及插件等,如果设置了则添加到Configuration对象上,解析Mapper配置文件,关于解析

配置文件这就先不介绍了,把解析后生成的对应sql的statement放到Configuration对象上,把Configuration对象设置到SqlSessionFactory对象上并且返回SqlSessionFactory对象到Spring容器中,

上文我们说到扫描到的以Mapper结尾的接口的Bean类型都是MapperFactoryBean类型,那么Spring容器实例化的时候会去构造该对象,该对象继承了SqlSessionDaoSupport对象并且实现了

FactoryBean接口,父类有个setSqlSessionFactory方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_配置文件_03


Spring容器会调用该方法,因为上文我们说到设置了sessionFactory的方法,会把刚刚构建好的SqlSessionFactory对象传递过来,然后传递到SqlSessionTemplate对象中

最后调用到 public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType,PersistenceExceptionTranslator exceptionTranslator) 方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_动态代理_04


这里我们看到有这样一个代码片段 this.sqlSessionProxy = (SqlSession) newProxyInstance(SqlSessionFactory.class.getClassLoader(),new Class[] { SqlSession.class },new SqlSessionInterceptor());

SqlSessionTemplate有个SqlSession的成员属性,它是一个实现了SqlSession的动态代理,动态代理的invoker是SqlSessionInterceptor,这个类我们在下文

分析它,现在setSqlSessionFactory方法执行完成以后MapperFactoryBean已经有了一个SqlSession的成员属性,实现类是SqlSessionTemplate,那么Spring容器最终返回的对象

是什么那?根据Spring原理,对于实现FactoryBean接口的类,会调用该类的getObject返回真正的对象,MapperFactoryBean的getObject方法截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_java_05

getSqlSession方法返回的是SqlSessionTemplate对象,调用了SqlSessionTemplate对象的getMapper方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_动态代理_06


该方法是一个泛型方法,返回指定接口类型,getConfiguration()方法返回MybatisConfiguration,是MybatisPlus的类,上面有说过,接着调用MybatisMapperRegistry的getMapper方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_java_07

调用MapperProxyFactory的newInstance()方法,截图如下:

springboot mybatis 整合impala springboot整合mybatis源码_sql_08


实例化一个MapperProxy对象,该对象实现了JDK动态代理类InvocationHandler,接着调用newInstance方法返回一个mapperInterface接口代表的动态代理类,至此我们就获取了Mapper的真正实现类,下个文章

我们说Mybaits执行查询的源码。