阿昌教你看懂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。
此时就会执行我们上面提到的实现InitializingBean
的afterPropertiesSet
方法内容,来建立对应的SqlSessionFactory
给MybatisSqlSessionFactoryBean
设置上
在buildSqlSessionFactory
方法中会大量的初始化复制操作,从读取配置类文件获取队友的属性,没有就默认初始化,有就跳过用我们指定的配置。
这一步是就根据配置文件new一个DefaultSqlSessionFactory
,进行一系列操作,最后返回
最后给sqlSessionFactory附上这个配置完成的DefaultSqlSessionFactory
到了这里,sqlSessionFactory就算成功创建过程完成。
这次的记录内容结束了,感谢你能看到这里!!! (•‾̑⌣‾̑•)✧˖°
以上是关于阿昌教你看懂mybatisplus的SqlSessionFacotry的创建过程的主要内容,如果未能解决你的问题,请参考以下文章