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