mybatis是如何集成到spring的

news2025/1/26 15:32:14

前言

集成前的使用方式

mybatis单独使用时,一般的写法如下所示:

// mybatis初始化
String resource = "mybatis-config.xml";  
InputStream inputStream = Resources.getResourceAsStream(resource);  
// 读取配置文件,创建SqlSessionFactory 
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 打开SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();  

// 执行SQL语句
List list = sqlSession.selectList("com.gameloft9.demo.dataaccess.dao.system.UserMapper.getByLoginName");

集成到spring方式

将mybatis集成到spring之后,就可以被spring的ioc容器托管,再也不用自己创建SqlSessionFactory 、打开SqlSession等操作。具体的集成方法可以参考之前写的文章:spring集成mybatis进行数据库访问,其中最重要的配置就是定义好SqlSessionFactoryBean,如下所示:

<!--mybatis sqlSeesionFactory配置-->
		<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
			<property name="dataSource" ref="dataSource" />
			<property name="configLocation" value="classpath:mybatis-config.xml" />
			<property name="mapperLocations" value="classpath:mapper/*Mapper.xml" />
			<property name="typeAliasesPackage" value="com.gameloft9.demo.dataaccess.model" />
		</bean>

因此想要了解spring集成mybatis的原理,就应该从SqlSessionFactoryBean入手。

SqlSessionFactoryBean

SqlSessionFactoryBean,顾名思义跟SqlSessionFactory有着莫大的关系,它的类结构如下所示:
在这里插入图片描述
SqlSessionFactoryBean实现了InitializingBean接口,我们知道InitializingBean在Bean的生命周期里面扮演了重要的角色,spring创建bean的流程大概是:
1、创建beanFactory
2、加载beanDefinition
3、通过反射创建bean实例
4、bean的生命周期扩展点调用
其中第4步骤又包含:
5、如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
6、如果bean实现IntializingBean了,调用它的afterPropertySet方法。
7、如果bean定义了init-method,调用init方法
8、如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。
9、如果bean实现了 DisposableBean,它将调用destroy()方法。
10、如果bean定义了destroy-method,调用destroy方法。
因此在我们xml配置好的dataSource,configLocation等属性设置好后,SqlSessionFactoryBean就在afterPropertySet()方法里面对SqlSessionFactory进行初始化。
在这里插入图片描述

buildSqlSessionFactory做了什么事情

buildSqlSessionFactory里面就是具体怎么创建SqlSeesionFactory的,代码流程比较长,我们用一个简单时序图来展示:
在这里插入图片描述
在解析完各种配置后,调用了return this.sqlSessionFactoryBuilder.build(configuration);来创建buildSqlSessionFactory,是不是和之前的方式很类似了?只是一个是入参是resource,一个是我们解析后的配置configuration对象。

为什么是SqlSessionFactoryBean却可以使用SqlSessionFactory?

我们注册的是SqlSessionFactoryBean这个bean,为什么却说SqlSessionFactory也成为了spring的bean呢?我们的SqlSessionFactoryBean还实现了FactoryBean这个接口。

Spring 中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean 即 FactoryBean。FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。
一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。

然后回到maybatis这里,我们通过时序图确实发现创建SqlSessionFactory十分复杂,要解析大量的配置之后才能创建,因此我们实现了FactoryBean接口:
在这里插入图片描述
在getObject里面选择性的进行初始化并返回SqlSessionFactory对象。
至于获取SqlSessionFactorybean实例的时候,是怎么走到FactoryBean的getObject的方法的,可以参考AbstractBeanFactory.getBean方法,这属于spring ioc范畴了,这个需要很长的篇幅才能讲清楚,有机会我会单独写一篇spring怎么创建bean和获取bean的。

总结

mybatis通过SqlSessionFactoryBean将SqlSessionFactory对象集成到spring中,它实现了InitializingBean接口,在SqlSessionFactoryBean初始化时解析配置并创建DefaultSqlSessionFactory对象。它还实现了FactoryBean,在getObject时返回我们创建好的DefaultSqlSessionFactory,使得DefaultSqlSessionFactory也被spring管理。
很多框架集成到spring的方法基本都是靠InitializingBean和FactoryBean这两个接口来实现的,这是一种非常好的设计,值得我们好好学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

这五个问题一下就看出阿里通义千问和ChatGPT的差距了

前言 阿里通义千问申请过了&#xff0c;为了看看达到了什么水平&#xff0c;于是我问题了5个ChatGPT回答过的问题1&#xff0c;这五个问题网上都是没有的&#xff0c;是我自己想出来的。 问题一:小明说今天他吃了一只公鸡蛋&#xff0c;请问小明诚实吗&#xff1f; ChatGPT 这…

黑马Redis笔记高级篇 | 多级缓存

黑马Redis笔记高级篇 | 多级缓存&#xff08;黑马教程云服务器踩坑记录&#xff09; 1、JVM进程缓存&#xff08;tomcat服务内部&#xff09;1.1 导入商品案例1.2 初识Caffeine1.3 实现进程缓存 2、Lua语法入门2.1 初识Lua2.2 变量和循环2.3 条件控制、函数 3、多级缓存3.1 安装…

快速了解LVQ神经网络是什么

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一. 快速了解LVQ神经网络 1.1 LVQ神经网络是什么 1.2 LVQ神经网络的表示 二. 关于LVQ神经网络的判别计算过程 2.1 LVQ神经网络模型与它的判别方法 2.2 LVQ模型的…

【论文阅读】MINOTAUR: Multi-task Video Grounding From Multimodal Queries

背景动机 细粒度的视频理解已经成为增强现实(AR)和机器人应用开发的关键能力。为了达到这种级别的视频理解&#xff0c;智能体(例如虚拟助手)必须具备识别和推理视频中捕获的事件和对象的能力&#xff0c;处理一系列视觉任务&#xff0c;如活动检测、对象检索和(空间)时间基础…

教你设置dsn,brd文件关联到cadence

用过cadence的人应该都知道&#xff0c;很多人存在dsn,brd文件无法关联到cadence&#xff0c;从而导致无法直接双击对应的文件打开软件编辑&#xff0c;不得不先打开软件&#xff0c;再通过文件夹浏览来打开对应的文件&#xff0c;这其实是浪费了一些时间的。 下面通过简单的介…

Linux应用开发:socket

目录 1、TCP 1.1 TCP建立连接的流程图 1.2 TCP函数 1.2.1 socket 1.2.2 bind 1.2.3 listen 1.2.4 accept 1.2.5 recv 1.2.6 send 1.2.7 connnect 1.2.8 setsockopt、getsockopt 1.3 应用程序&#xff1a;服务器 1.4 应用程序&#xff1a;客户端 2、UDP 2.1 UDP建…

Github上传大于25M文件最简单方法!!!

Github上传大于25M文件最简单方法 方法&#xff1a;使用 GitHub 桌面应用程序1.下载 [Github](https://desktop.github.com/)应用程序到您的 Windows 或 Mac PC 上。2.单击“从互联网克隆存储库...”选项。3. 使用您的 Git 帐户登录。4. GitHub 应用程序将提示您使用电脑浏览器…

Docker安装Kong konga

一、安装Kong 1. 创建一个docker网络 docker network create kong-net2.拉取镜像 docker pull postgres:9.6 docker pull kong:2.6.03. 搭建pgsql数据库环境 docker run -d --name kong-database \--networkkong-net \-p 5432:5432 \-e "POSTGRES_USERkong" \-e …

Cisco Nexus 9000v Switch, NX-OS Release 10.3(3)F - 虚拟化的数据中心交换机

Cisco Nexus 9000v Switch, NX-OS Release 10.3(3)F - 虚拟化的数据中心交换机 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-nexus-9000v/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org NX-OS System SoftwareR…

Java接口介绍

Java接口介绍 接口&#xff08;Interface&#xff09;&#xff0c;在Java编程语言中是一个抽象类型&#xff0c;是抽象方法的集合&#xff0c;接口通常以interface关键字来声明。Java接口是用于描述类所具有的方法集合&#xff0c;但并不提供实现这些方法的代码。它们被用来定义…

Leetcode刷题日志5.0

目录 前言&#xff1a; 1.两数相加 2.无重复字符的最长子串 3.整数反转 4.删除链表的倒数第 N 个结点 前言&#xff1a; 今天我又来继续分享最近做的题了&#xff0c;现在开始进入我们快乐的刷题时间吧&#xff01;&#xff08;编程语言Python3.0&#xff0c;难度&#xf…

C++模板详解(函数模板、类模板)

hello,这里是bangbang&#xff0c;今天来讲下模板 目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的实例化 2.4 模板参数的匹配原则 3. 类模板 3.1 类模板定义格式 3.2 类模板实例化 4. 非类型模板参数 5. 模板特化 5.1 模板特化概念 5.2…

计算机视觉——day 90 基于级联卷积神经网络和对抗学习的显著目标检测

基于级联卷积神经网络和对抗学习的显著目标检测 I. INTRODUCTIONII. 网路架构A. 基于级联卷积神经网络的生成器G全局显著性估计器 E局部显著性精炼器 R B.鉴别器 DIv. 实验A. 数据集和评价标准B. 实验结果 V. 结论 I. INTRODUCTION 显著目标检测在过去的几年中受到了广泛的关注…

AcWing算法提高课-1.3.7货币系统

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 在网友的国度中共有  n n n 种不同面额的货币&#xff0c;第  i i i 种货币的面额为  a [ i ] a[i] a[i]&#xff0c;你可以假…

Linux知识点 -- Linux环境基础开发工具使用

Linux知识点 – Linux环境基础开发工具使用 文章目录 Linux知识点 -- Linux环境基础开发工具使用一、Linux编辑器 - vim1.vim的打开与关闭2.vim的三种模式3.命令模式常见命令4.底行模式命令5.设置vim的table键为4个字符 二、Linux编辑器 - gcc / g1.介绍2.gcc / g的使用3.gcc /…

docker笔记详解

Docker 官方文档地址:https://www.docker.com/get-started 中文参考手册:https://docker_practice.gitee.io/zh-cn/ 1.什么是 Docker 1.1 官方定义 最新官网首页 # 1.官方介绍 - We have a complete container solution for you - no matter who you are and where you are …

Linux | 将SpringBoot+Vue项目部署到服务器上

知识目录 一、写在前面二、后端部署2.1 项目打包2.2 项目运行 三、通过Shell脚本自动部署项目3.1 安装Git和Maven3.2 编写Shell脚本3.2 执行脚本 四、前端部署4.1 安装NGINX4.2 node.js安装4.3 npm打包项目4.4 运行项目 四、总结撒花 一、写在前面 大家好&#xff0c;我是初心…

MyBatis配置

配置结构 属性&#xff08;properties&#xff09; 属性不仅可以在内部直接修改&#xff0c;还可以在外部引入&#xff0c;外部引入需要在配置文件引入属性的文件&#xff0c; db.properties放在资源目录下面&#xff0c;然后在configuration标签下面导入外部配置的propertie…

Kali linux ssh Permission denied, please try again解决

新装的kali 没有ssh 装上ssh后root用户禁止登录所以要修改ssh配置&#xff0c;下面就这个过程解决全部演示。 默认情况下 SSH 不允许以 root 用户登录&#xff0c;因此将会出现下面的错误提示信息&#xff1a; Permission denied, please try again.kali linux 默认没有ssh,因此…

股票量价关系基础知识5

图解各阶段量价关系&#xff1a;价涨量增 价涨量增是指股价上涨的同时成交量也放大。它是最常见的多头进攻模式&#xff0c;说明价量配合良好&#xff0c;反映投资者买卖情绪高涨。成交量放大说明有资金流入&#xff0c;做多力量增强&#xff0c;后市看涨。 注意&#xff1a;1…