mybatis是如何集成到spring的之SqlSessionFactoryBean

这篇具有很好参考价值的文章主要介绍了mybatis是如何集成到spring的之SqlSessionFactoryBean。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

1.1 集成spring前使用mybatis的方式

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");

1.2 集成mybatis到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入手。

2 SqlSessionFactoryBean对象分析

SqlSessionFactoryBean,顾名思义跟SqlSessionFactory有着莫大的关系,它的类结构如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
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进行初始化。
mybatis是如何集成到spring的之SqlSessionFactoryBean

2.1 buildSqlSessionFactory做了什么事情?

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

2.2 为什么是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接口:
mybatis是如何集成到spring的之SqlSessionFactoryBean
在getObject里面选择性的进行初始化并返回SqlSessionFactory对象。
至于获取SqlSessionFactorybean实例的时候,是怎么走到FactoryBean的getObject的方法的,可以参考AbstractBeanFactory.getBean方法,这属于spring ioc范畴了,这个需要很长的篇幅才能讲清楚,有机会我会单独写一篇spring怎么创建bean和获取bean的。

3 验证demo

如果你有demo的话,可以单步跟踪。如果没有的话,可以使用作者之前做过的一个基于layui的通用后台系统,简单的安装mysql和客户端之后(本地安装mysql和客户端真的很简单30分钟搞定吧)、稍微改下配置就可以直接运行这个项目(这个项目麻雀虽小,但五脏俱全,如果觉得好用,可以帮忙点个start)。

验证之前,我们先做个猜想:SqlSessionFactory是在afterPropertiesSet里初始化的还是在getObject里判断为空再初始化的?

我们分别在SqlSessionFactoryBean的afterPropertiesSet和getObject打上断点,然后debug项目,如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
可以看到,在SqlSessionFactoryBean实例创建后,在afterPropertiesSet对SqlSessionFactory进行了初始化和创建。然后在获取它的时候,走的是getObject方法(这时候sqlSessionFactory已经不为空了):
mybatis是如何集成到spring的之SqlSessionFactoryBean

4 举一反三

4.1 插件的配置是在SqlSessionFactoryBean的定义里面还是configuration的xml结点下面?

demo里的插件我们是写在mybatis-config.xml里面的configuration结点里面的,如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
这是通用的做法,当然你也可以经常看到有人配置在SqlSessionFactoryBean的定义里面,如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
那么问题来了,这两个有什么区别吗?
这个比较简单,作者自问自答一下。
这两个都可以作为插件的配置方式,都会起作用,因为在buildSqlSessionFactory过程中,如果发现插件不为空,就会添加到插件集合里面去,如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
然后再解析xml时,又会将configuration的配置解析一遍,里面也包含插件的解析过程:
mybatis是如何集成到spring的之SqlSessionFactoryBean
mybatis是如何集成到spring的之SqlSessionFactoryBean
所以我们只需要在一个地方配置好就行了。然后它们有一个细微的差别,因为configuration是mybatis的配置,所以在configuration中的插件配置,是通过调用setProperties方法将属性传递进来,然后设置到插件的属性中。SqlSessionFactoryBean的插件配置不会调用setProperties方法,直接走的setter注入将属性注入进去。
mybatis是如何集成到spring的之SqlSessionFactoryBean
这个大家也可以自行验证下。

4.2 mybatis的事务管理和spring的事务管理什么关系?

如果你仔细看了SqlSessionFactoryBean创建SqlSessionFactory的过程,那么肯定会注意到有这么一个调用:

if (this.transactionFactory == null) {
      this.transactionFactory = new SpringManagedTransactionFactory();
    }

因为我们配置的是spring的事务,在mybatis的配置文件里面没有为SqlSessionFactoryBean配置事务,如下所示:
mybatis是如何集成到spring的之SqlSessionFactoryBean
所以那段代码里面transactionFactory会因为==null,而创建一个SpringManagedTransactionFactory,下面的截图也刚好印证了我们的观点。
mybatis是如何集成到spring的之SqlSessionFactoryBean
那么问题来了,mybatis的事务和spring的事务是什么关系?它们是怎么配合的?
这个问题回答比较复杂,需要有spring事务的知识,大家可以尝试自己找答案,或者等作者后续的文章来解答。

5 总结

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

到了这里,关于mybatis是如何集成到spring的之SqlSessionFactoryBean的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring与MyBatis框架集成

    尽管Spring本身提供了Spring JDBC作为对JDBC的抽象和简化,但与MyBatis集成可以提供更多的功能和灵活性。MyBatis是一款优秀的持久层框架,它通过XML或注解的方式将SQL语句与Java方法进行绑定,提供了更直观和便捷的方式来管理数据库操作。集成Spring和MyBatis可以发挥两者的优势,

    2024年02月08日
    浏览(38)
  • 一文吃透Spring集成MyBatis

    个人主页: 几分醉意的CSDN博客_传送门 spring能集成很多的框架,是spring一个优势功能。通过集成功能,让开发人员使用其他框架更方便。集成使用的是spring ioc 核心技术。 使用mybatis,需要创mybatis框架中的某些对象,使用这些对象,就能使用mybatis提供的功能了。 1.创建实体类

    2024年02月06日
    浏览(50)
  • Mybatis与Spring集成配置

    目录 具体操作 1.1.添加依赖 1.2创建spring的配置文件 1.3. 注解式开发  Aop整合pagehelper插件 1. 创建一个AOP切面 2. @Around(\\\"execution(* *..*xxx.*xxx(..))\\\") 表达式解析                      前言: 上篇我们讲解了关于Mybatis的分页,今天我们讲Mybatis与Spring集成配置。 特别提示: 关于数

    2024年02月11日
    浏览(52)
  • 实现Spring Boot集成MyBatis

    在Java开发中,Spring Boot和MyBatis是非常常用的框架。Spring Boot是一个快速开发应用程序的框架,而MyBatis是一个持久化框架,可以方便地操作数据库。本文将介绍如何使用Idea集成Spring Boot和MyBatis,并创建一个简单的示例项目。 步骤1:创建Spring Boot项目 1、打开Idea,点击\\\"Create N

    2024年02月09日
    浏览(43)
  • 【推荐】Spring与Mybatis集成整合

    目录 1.概述 2.集成 2.1代码演示: 3.整合  3.1概述 3.2 进行整合分页 接着上两篇,我已经写了Mybatis动态之灵活使用,mybatis的分页和特殊字符的使用方式接下来把它们集成起来,是如何的呢👇👇👇。 集成是指将不同的组件、系统或框架整合在一起,使它们能够协同工作,共同

    2024年02月11日
    浏览(38)
  • Spring Boot集成MyBatis Plus

    在现代软件开发中,构建高效、可维护的项目是至关重要的。Spring Boot 是一个流行的框架,它简化了Java应用程序的开发过程。而 MyBatis Plus 则是一个强大的持久层框架,通过简化数据库操作,提升了开发效率。本文将介绍如何使用 Spring Boot 结合 MyBatis Plus 构建高效的项目,附

    2024年02月11日
    浏览(44)
  • 7. Spring Boot 与MyBatis集成

    在我们日常的开发过程中,肯定不可避免的会使用到数据库以及 SQL 语句。比如,刚开始学习 Java 的时候可能会遇到 JDBC,它是连接 Java 和数据库的桥梁,我们可以使用 JDBC 来建立与数据库之间的连接并且执行相应的 SQL 语句。虽然 JDBC 的执行效率很高,但是其开发效率比较低

    2024年01月25日
    浏览(47)
  • IDEA项目实践——Spring集成mybatis、spring当中的事务

    IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——Spring当中的切面AOP 文章目录 系列

    2024年02月13日
    浏览(38)
  • Spring与Mybatis集成且Aop整合

    目录 一、集成 1.1 集成的概述 1.2 集成的优点 1.3 代码示例 二、整合 2.1 整合概述 2.2 整合进行分页 集成是指将不同的组件、部分或系统组合在一起,以形成一个整体功能完整的解决方案。它是通过连接、交互和协调组件之间的关系来实现的。 集成可以应用于各个领域,包括

    2024年02月11日
    浏览(49)
  • SSM(Spring+SpringMVC+MyBatis)框架集成

    进行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是为了提高开发效率和代码可维护性。SSM是一套非常流行的Java Web开发框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自发挥优势,形成了一个完整的开发框架。 首先,使用Spring框架可以实现组件的解耦和依赖注入,通过配

    2024年02月08日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包