首先定义MapperScan
MapperScan会导入MapperScanRegistrar。这个类很重要。这个类注意是把path下的bean扫描的定义definition扫描进来。
这个register方法是什么时候执行的?
由于它是imports进来的,项目启动后configurationclass parse的时候会把imports注释里面的类放到Map
configurationclass reader的时候专门有一步来处理这个Map,遍历这个map会调用这个Register对象的registerBeanDefinitions 方法。
scan的时候的细节:
Mapper类的beanclass设置为MapperFactoryBean。FactoryBean是一种特殊的bean。
MapperFactoryBean会重载getObject方法。这样对Mapper类的实例就委托给了这个方法。这个方法会生成代理。最终这个mapper对象是MapperProxy,mapperProxy调用methodProxy。
总结:mybatis主要用到imports功能
@Import(MapperScannerRegistrar.class)
configurationClass解析的时候会把Register类固定写死getImportBeanDefinitionRegistrars去执行。ImportResource和ImoprtRegister会单独处理。
loadBeanDefinitionsFromImportedResources(configClass.getImportedResources()); loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
把path下的bean都交给RegisterBean单独按mybatis的业务客制化解析。