阿昌教你看懂mybatisplus的SqlSessionFacotry的创建过程

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿昌教你看懂mybatisplus的SqlSessionFacotry的创建过程相关的知识,希望对你有一定的参考价值。

前言

前置版本:MybatisPlus3.0.5

这几天阿昌又开始研究mybatisplus的内容,我就先开始研究mybatis在springboot的环境下,是如何进行对SqlSessionFacotry类进行创建注入的。

这里就记录下自己学习到的内容。感谢各位大佬的观看 •̀ㅂ•́)و!


正文

在一开始,对于看Springboot的内容,必然去找XXXXAutoConfiguration的自动配置类。

那我们就去mybatisplus的源码,去找MybatisPlusAutoConfiguration

那一来到这个类,我们必然看他头上的注解是什么,这个是springboot的自动装配的内容。

//@Configuration:经典! 配置类注解
//@ConditionalOnClass:表示这个类,需要在SqlSessionFactory/SqlSessionFactoryBean都存在才会生效
//@ConditionalOnSingleCandidate:表示当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean
//@EnableConfigurationProperties:让使用了 @ConfigurationProperties 注解的类生效,并且将该类注入到容器中并交由容器管理
//@AutoConfigureAfter:指这个类,是在DataSourceAutoConfiguration类注入配置之后再进行注入
@org.springframework.context.annotation.Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisPlusProperties.class)
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class MybatisPlusAutoConfiguration {}

上面的我关注在@EnableConfigurationProperties这里注解,点进去后看,这个类提供读取配置文件进行依赖注入

比如我在src/main/resources/application.properties配置文件中指定了mybatisplus的配置

#xml文件的位置
mybatis-plus.mapper-locations=classpath:com/achang/zybservice/mapper/xml/*.xml
#entity包的位置
mybatis-plus.type-aliases-package=com.achang.zybservice.entity
#额外配置的位置
mybatis-plus.config-location=classpath:mybatis-config.xml

src/main/resources/mybatis-config.xml的内容为

<configuration>
    <!-- 全局配置 -->
    <settings>
        <!-- 是否开启自动驼峰命名规则(camel case)映射,即从数据库列名 A_COLUMN 到属性名 aColumn 的类似映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 获取数据库自动生成的主键ID -->
        <setting name="useGeneratedKeys" value="true"/>
    </settings>
</configuration>

那么到这里,可以看到通过@EnableConfigurationProperties注解来读取配置文件中的信息。


那对于mybatis中,最重要的就是sqlSessionFactory!!!,那他是什么时候被注入到ioc容器中的呢???

向下看,发现,给容器注入SqlSessionFactory

这里又有一个注解@ConditionalOnMissingBean,那么问题来了,这个注解是干嘛的用的?无聊标的???

@ConditionalOnMissingBean:当给定的在bean不存在时,则实例化当前Bean.

也就是说,当容器里面没有SqlSessionFactory时,那就会自动注入下面的内容。

首先,他new了一个MybatisSqlSessionFactoryBean,他实现了FactoryBean<SqlSessionFactory>InitializingBean

  • FactoryBean,spring提供的工厂bean,这里就是交给了spring进行管理SqlSessionFactory工厂
  • InitializingBean,凡是实现了它,就在初始化bean的时候都会执行重写的afterPropertiesSet方法。

看到这里,我们还是没看到他什么时候给注入sqlSessionFactory工厂,那到底在哪里呢?

因为SqlSessionFactoryBean实现了InitializingBean,所以就要重写afterPropertiesSet方法,这个方法会在初始化bean的时候后执行,那我们看afterPropertiesSet方法

一上来,就引入眼帘的看到了buildSqlSessionFactory!!!也就是说,他在SqlSessionFactoryBean初始化完成后就建立SqlSessionFactory

那么此时,还没到执行afterPropertiesSet的时机,因为需要在SqlSessionFactoryBean初始化完成后才执行

也就是SqlSessionFactory注入完成后,就会执行afterPropertiesSet方法

那我们把继续看,SqlSessionFactory的注入内容。

因为在开始设置这个自动配置类的注入时机,是在DataSourceAutoConfiguration之后的,所以此时ioc容器中已经有数据源的内容 •˘_˘•)

所以,这里就直接通过入参获取注入对象,从容器中获取数据源,并设置。

setVfs(),虚拟文件系统,不是这次记录的重点

接下来,他就从读取配置文件的类种获取我们是否有指定配置自己的mybatis配置类,因为我们配置了,所以这里会有。因此,他就会给其本地配置ConfigLocation设置上

下面就会applyConfiguration(factory)

applyConfiguration是具体给工厂设置对应配置内容

接下来就是给工厂设置各种的内容,如果我们有指定就给设置,没有就不设置

最后设置完,就会给容器注入对应的factory。

此时就会执行我们上面提到的实现InitializingBeanafterPropertiesSet方法内容,来建立对应的SqlSessionFactoryMybatisSqlSessionFactoryBean设置上

buildSqlSessionFactory方法中会大量的初始化复制操作,从读取配置类文件获取队友的属性,没有就默认初始化,有就跳过用我们指定的配置。

这一步是就根据配置文件new一个DefaultSqlSessionFactory,进行一系列操作,最后返回

最后给sqlSessionFactory附上这个配置完成的DefaultSqlSessionFactory

到了这里,sqlSessionFactory就算成功创建过程完成。


这次的记录内容结束了,感谢你能看到这里!!! (•‾̑⌣‾̑•)✧˖°

以上是关于阿昌教你看懂mybatisplus的SqlSessionFacotry的创建过程的主要内容,如果未能解决你的问题,请参考以下文章

阿昌教你看懂mybatisplus的sql语句的创建过程

阿昌教你看懂mybatisplus的sql语句的创建过程

阿昌教你看懂mybatisplus的sql执行流程

阿昌教你看懂mybatisplus的sql执行流程

阿昌教你看懂SpringMVC执行流程

阿昌教你看懂SpringMVC执行流程