上篇笔记主要记录了BeanDefinitionRegistryPostProcessor扩展机制的实现原理,这篇笔记注意记录下,自己在学习源码的过程中,看到的该扩展机制使用的地方
其实我上篇笔记有说过,这个扩展机制,太靠前,如果我们通过@Component注解去注入到spring容器中,那我们自定义的实现类是在所有的业务bean还没有放到spring容器中的时候,就执行了,此时一般也很少有业务需求是在这个时候对beanDefinition进行一些修改,但是,在底层框架中,有可能会用到这个扩展点,我看到的是mybatis底层有用到这个扩展点
mybatis是干什么的
其实mybatis就是一个持久层框架,在和spring整合的时候,简单来说,我觉得就做了一件事情,将我们程序员自己写的mapper接口交给spring去管理
但是需要想一下,一个接口,怎么交给spring去管理?这里面的一个设计思想,我觉得是值得学习的:对于spring来说,不会为了去整合mybatis而去修改自己的代码,那原生的mybatis会修改吗?当然也不会,因为mybatis如果只是为了整合spring,修改了自己的代码,那mybatis就不是mybatis了,那怎么办呢?两者想要结合,总要有一个中间粘合剂,那这时候,spring就说了,你既然想和我进行整合,那你自己去扩展一个jar包,专门负责和我spring整合用,你可以利用我暴露给你的扩展点,总之,我不管你怎么做,你只要把你的接口放到我的beanDefinitionMap中,就可以了,我负责去初始化,然后放到容器中,至于你怎么把mapper接口放到我的beanDefinitionMap,我不管
那这时候,mybatis就自己去实现类一个jar包:mybatis-spring-1.3.2.jar
也就是在这个jar包中,mybatis利用了spring的BeanDefinitionRegistryPostProcessor这个扩展点,去把我们程序员提供的mapper接口,放入到了beanDefinitionMap中
mybatis整合spring原理
我们在使用mybatis的时候,需要加一个注解,@MapperScan,在该注解中,指定要扫描的路径,这个路径是给谁用的?就是给我们这篇笔记要学习的BeanDefinitionRegistryPostProcessor的实现类MapperScannerConfigurer