@MapperScan与@Bean配置MapperScannerConfigurer的区别及多数据源适配咨询
嘿,针对你用Spring Boot 1.5.12 + MyBatis-Spring-Boot-Starter 1.3.2搭建的多数据源项目,我来给你掰扯清楚@MapperScan和用@Bean配置MapperScannerConfigurer的核心差异——都是实战里踩过的点,对照你现有的Datasource1Config、Datasource2Config来看就明白啦:
核心差异对比
1. 配置简洁性:注解式 vs 编程式
@MapperScan注解:属于注解式配置,直接加在配置类或启动类上,参数一目了然。比如多数据源场景下,你可以在每个数据源配置类上单独标注:
不用手动创建@Configuration @MapperScan(basePackages = "com.yourproject.mapper.ds1", sqlSessionTemplateRef = "sqlSessionTemplate1") public class Datasource1Config { // 配置DataSource、SqlSessionFactory、SqlSessionTemplate... }MapperScannerConfigurer实例,代码清爽,新手也不容易写错。@Bean配置MapperScannerConfigurer:属于编程式配置,需要手动创建实例并逐个设置属性,就像你现在写的代码那样:
步骤繁琐,但能精准控制每一项配置。@Bean public MapperScannerConfigurer mapperScannerConfigurer1() { MapperScannerConfigurer scanner = new MapperScannerConfigurer(); scanner.setBasePackage("com.yourproject.mapper.ds1"); scanner.setSqlSessionTemplateBeanName("sqlSessionTemplate1"); return scanner; }
2. 与Spring Boot自动配置的兼容性
@MapperScan:是MyBatis Spring Boot Starter专门提供的注解,和Boot的自动配置逻辑完全适配。它会自动识别你配置的SqlSessionFactory、SqlSessionTemplate等Bean,减少手动配置的出错概率。在1.5.x版本里,这个注解和starter的整合度极高,能帮你省略很多冗余配置。- 编程式配置
MapperScannerConfigurer:相当于完全接管了Mapper扫描逻辑,需要自己保证依赖的Bean(比如SqlSessionTemplate)已经完成初始化,否则容易出现依赖顺序错误——比如扫描器初始化时,对应的SqlSessionTemplate还没创建,直接抛异常。多数据源场景下尤其要注意这点,可能需要额外加@DependsOn来控制Bean加载顺序。
3. 多数据源场景的细节差异
@MapperScan:每个数据源的配置类上单独标注,通过sqlSessionTemplateRef直接绑定对应的SqlSessionTemplate,逻辑清晰,不会混淆不同数据源的Mapper。而且注解会自动处理扫描范围和绑定关系,不用手动操心扫描器的初始化时机。- 编程式配置
MapperScannerConfigurer:因为MapperScannerConfigurer是BeanFactoryPostProcessor类型的Bean,初始化时机很早,所以不能直接注入SqlSessionTemplate实例,必须用setSqlSessionTemplateBeanName传入Bean名称——这是很多人在多数据源配置时踩的坑,稍不注意就会出现依赖找不到的问题。
4. 扩展灵活性
@MapperScan:参数是固定的几个(比如basePackages、annotationClass、sqlSessionFactoryRef),适合大多数常规场景,满足90%的业务需求没问题。- 编程式配置
MapperScannerConfigurer:可以自定义更多细节,比如设置markerInterface(只扫描实现了某标记接口的Mapper)、自定义BeanNameGenerator生成Mapper的Bean名称,甚至直接绑定SqlSessionFactory而非SqlSessionTemplate,适合复杂定制化的场景。
总结建议
如果你的项目是常规多数据源场景,没有特殊定制需求,用@MapperScan更省心,代码简洁还不容易出错;如果需要一些特殊的扫描规则或定制逻辑,再考虑用编程式配置MapperScannerConfigurer。结合你当前的Spring Boot 1.5.12版本,@MapperScan和MyBatis Starter的兼容性已经很好,完全可以替代你现在的编程式配置,让代码更清爽。
内容的提问来源于stack exchange,提问作者Rifu
相关产品推荐
相关产品推荐

