Spring整合Mybatis的原理分析

Spring 整合Mybatis的原理 入口@MapperScan

這里有新版本和老版本區(qū)分,

a.解析AppConfig類上的@MapperScan發(fā)現(xiàn)他繼承@import注解里面有個MapperScannerRegister 它實現(xiàn)了Spring的一個擴展接口ImportBeanDefinitionRegister,所以spring容器初始化的時候會執(zhí)行它的override方法registerBeanDefinitions。

b.老版本在這個方法里面new了一個ClassPathMapperScanner(掃描器)這個類繼承了我們Spring內(nèi)置的Bean的掃描器類ClassPathBeanDefinitionScanner,通過它的doScan方法去掃描我們的配置的包名下面的所有Mapper接口類,為他們生成對應(yīng)的BeanDefinition然后注冊到我們的spring容器中的beanDefinitionMap 里面,這里的BeanDefinition是一個特殊的Bean定義,就是我們的FactoryBean,什么是FacteroyBean下回再說

c.新版本在這個方法里面卻是注冊了一個BeanDefinition ->? MapperScannerConfigurer?這個類它實現(xiàn)了我們spring的又一個擴展點接口BeanDefinitionRegisterPostProcessor(BeanFactoryPostProcessor的子類),這里我多羅嗦一句,Spring自己也有一個類ConfigurationClassPostProcessor(這個類很重要-知識點) 實現(xiàn)了BeanDefinitionRegisterPostProcessor。

然后在它的實現(xiàn)方法(postProcessBeanDefinitionRegistry)里面完成了上面b的內(nèi)容。

所以這里要說一下新老版本的區(qū)別,新版是通過了一個BeanFactory的后置處理器注冊我們的Mapper接口的。

而老版本是通過spring的ImportBeanDefinitionRegister 這個擴展點注冊我們Mapper接口的(所謂的注冊,就是為我們Mapper接口生成對應(yīng)的BeanDefinition然后放入到我們的Spring IOC容器中的beanDefinitionMap中,這個map就不用我多說了,懂Spring Bean的都應(yīng)該知道它的作用吧)

我用的是下面兩個版本分析的

mybatis-spring 2.0.0? -> 老版本

mybatis-spring 2.0.5 ->新版本

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容