Spring整合Mybatis的原理分析

Spring 整合Mybatis的原理 入口@MapperScan

这里有新版本和老版本区分,

a.解析AppConfig类上的@MapperScan发现他继承@import注解里面有个MapperScannerRegister 它实现了Spring的一个扩展接口ImportBeanDefinitionRegister,所以spring容器初始化的时候会执行它的override方法registerBeanDefinitions。

b.老版本在这个方法里面new了一个ClassPathMapperScanner(扫描器)这个类继承了我们Spring内置的Bean的扫描器类ClassPathBeanDefinitionScanner,通过它的doScan方法去扫描我们的配置的包名下面的所有Mapper接口类,为他们生成对应的BeanDefinition然后注册到我们的spring容器中的beanDefinitionMap 里面,这里的BeanDefinition是一个特殊的Bean定义,就是我们的FactoryBean,什么是FacteroyBean下回再说

c.新版本在这个方法里面却是注册了一个BeanDefinition ->  MapperScannerConfigurer 这个类它实现了我们spring的又一个扩展点接口BeanDefinitionRegisterPostProcessor(BeanFactoryPostProcessor的子类),这里我多罗嗦一句,Spring自己也有一个类ConfigurationClassPostProcessor(这个类很重要-知识点) 实现了BeanDefinitionRegisterPostProcessor。

然后在它的实现方法(postProcessBeanDefinitionRegistry)里面完成了上面b的内容。

所以这里要说一下新老版本的区别,新版是通过了一个BeanFactory的后置处理器注册我们的Mapper接口的。

而老版本是通过spring的ImportBeanDefinitionRegister 这个扩展点注册我们Mapper接口的(所谓的注册,就是为我们Mapper接口生成对应的BeanDefinition然后放入到我们的Spring IOC容器中的beanDefinitionMap中,这个map就不用我多说了,懂Spring Bean的都应该知道它的作用吧)

我用的是下面两个版本分析的

mybatis-spring 2.0.0  -> 老版本

mybatis-spring 2.0.5 ->新版本

你可能感兴趣的:(Spring整合Mybatis的原理分析)