javascript
SpringBoot Mybatis Starter 解析
1.Mybatis-starter模塊介紹
????????我們知道Mybatis有兩大核心組件:SqlSessionFactory和Mapper接口。該starter可以幫助我們自動(dòng)完成SqlSessionFactory和Mapper的裝配與注入,可以極大的簡(jiǎn)化我們的開(kāi)發(fā)難度,提高開(kāi)發(fā)效率。
Mybatis-starter主要完成以下功能:
2. Starter 自動(dòng)裝配解析
????????從該模塊的pom文件可以看出,它里面引入了mybatis-spring-boot-autoconfigure依賴,由此我們可以知道在該依賴的META-INF目錄下的spring.factories中配置了EnableAutoConfiguration的實(shí)現(xiàn)類,總共有2個(gè)分別是:MybatisLanguageDriverAutoConfiguration和MybatisAutoConfiguration。MybatisLanguageDriverAutoConfiguration主要是mapper配合注解方式編寫sql語(yǔ)句,適用于簡(jiǎn)單的sql,一般不加載。
MybatisAutoConfiguration裝配的條件是:
????????此外,在該配置類中注入了兩個(gè)Bean,分別是SqlSessionFactory,該類是單個(gè)數(shù)據(jù)庫(kù)經(jīng)過(guò)編譯之后內(nèi)存的鏡像,通過(guò)它可以于數(shù)據(jù)完成交互。另外一個(gè)是SqlSessionTemplate,該類封裝了SqlSessionFactory和SqlSession,里面還定義了數(shù)據(jù)庫(kù)操作方法,方便對(duì)數(shù)據(jù)進(jìn)行操作。操作數(shù)據(jù)的類是一個(gè)代理類,代理的核心邏輯在SqlSessionInterceptor類中。該代理方法也很簡(jiǎn)單,首先獲取SqlSession,之后調(diào)用method invoke方法。SqlSession的獲取是以SqlSessionFactory為key去本地的ThreadLocal中獲取,如果不存在就創(chuàng)建一個(gè)。
3.Mapper類掃描
??在MybatisAutoConfiguration中有2個(gè)內(nèi)部類,分別是:MapperScannerRegistrarNotFoundConfiguration和AutoConfiguredMapperScannerRegistrar,MapperScannerRegistrarNotFoundConfiguration的主要作用是ImportAutoConfiguredMapperScannerRegistrar,在方法registerBeanDefinitions中注冊(cè)了MapperScannerConfigurer類,該類實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口,會(huì)在bean實(shí)例化之前調(diào)用postProcessBeanDefinitionRegistry方法
?
? ? ?在processBeanDefinitions方法中,將beanDefinition的class替換成了MapperFactoryBeanClass的clas,MapperFactoryBeanClass是實(shí)現(xiàn)了FactoryBean,它里面有個(gè)getObject方法(getSqlSession().getMapper(this.mapperInterface)),該方法返回一個(gè)mapper 的代理對(duì)象MapperProxy,每次調(diào)用mappe 的方法都會(huì)去調(diào)用該類的invoke方法,最終調(diào)用MapperMethod的invoke方法,之后在調(diào)用mapperMethod的execute方法中,然后根據(jù)sql類型完成操作。
????????當(dāng)我們查看@MapperScan注解時(shí),發(fā)現(xiàn)它引入了MapperScannerRegistrar,該類實(shí)現(xiàn)了ImportBeanDefinitionRegistrar類,最終會(huì)調(diào)用RegisterBeanDefinitions方法,該方法與我們上面的解析流程一樣。在MybatisAutoConfiguration配置類中,如果要讓MapperScannerRegistrarNotFoundConfigurration配置生效,那么就需要不存在MapperScannerConfigurer的bean。因此該自動(dòng)配置類與@MapperScan只能有一個(gè)生效,放置mapper重復(fù)掃描。
總結(jié)
以上是生活随笔為你收集整理的SpringBoot Mybatis Starter 解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RabbitMQ介绍(详细)
- 下一篇: SpringBoot如何自定义start