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 ->新版本