You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:27