Springboot如何集成Mybatis

开始之前建议先了解什么是Spring的 FactoryBean

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。Spring  FactoryBean是创建复杂的bean,一般的bean直接用xml配置即可,如果一个bean的创建过程中涉及到很多其他的bean和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean.
这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。Mybatis和Spring集成,就是利用了FactoryBean.

SpringBoot中集成Mybatis需要引入依赖mybatis-spring-boot-starter,一看这个stater的命名就知道不是SpringBoot官方提供的,不知道SpringBoot官方和Mybatis有什么深仇大恨,这么流行的Mybatis都不提供对应的stater(我猜应该和Spring Jdbc是竞争关系所以不鸟Mybatis,哈哈),mybatis-spring-boot-starter的spring.factories可以看到如下自动配置:

图片

MybatisAutoConfiguration注解会创建sqlSessionFactory和SqlSessionTemplate:

图片

图片

Springboot怎么通过自动配置创建bean属于前面章节的内容,这里不针对sqlSessionTemplate和sqlSessionFactory的创建做专门的说明。

------------------漂亮的分割线-------------------

 

继续看Springboot启动过程中,重点关注怎么通过动态代理生成Mapper。Spring启动的过程中AbstractApplicationContext#refresh中会调用finishBeanFactoryInitialization(beanFactory),初始化的过程中先会实例化Controller,然后实例化Service,实例化Service的过程中处理依赖注入的时候会在CommonAnnotationBeanPostProcessor中调用getBean开始实例化Mapper:

图片

然后调用FactoryBeanRegistrySupport#getObjectFromFactoryBean:

图片

最后Spring交给mybatis-springMapperFactoryBean具体去创建Mapper

图片

然后调用mybatis-spring的SqlSessionTemplate#getMapper,调用mybatis的Configuration#getMapper,最终调用MapperRegistry#getMapper动态代理创建Mapper,你可以看到创建Mapper的时候已经把打开数据库会话的sqlSession注入进去了:

图片

 

更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/

posted on 2021-04-05 08:58  itproject-manager  阅读(306)  评论(0编辑  收藏  举报