阿古达芝麻开门 - 博客园

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 @   阿古达芝麻开门  阅读(313)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示