@MapperScan和@Bean MapperScannerConfigurer之间的差异

时间:2018-05-06 16:41:55

标签: java spring spring-boot spring-mybatis multi-database

我有一个多数据源Web应用程序,具有以下技术:

  • Spring boot 1.5.12
  • Mybats-Spring-boot-starter 1.3.2

我更喜欢基于Java的配置。因此,我有Datasource1Config.java和Datasource2Config.java。

我分别定义了SqlSessionTemplate,并使用MapperScannerConfigure注入我的mapper。以下是datasource1,datasource2只替换数字。

@Bean(name = "dataSource1MapperScannerConfigurer")
public MapperScannerConfigurer msc() {
    MapperScannerConfigurer msc = new MapperScannerConfigurer();
    msc.setSqlSessionFactoryBeanName("dataSource1SqlSessionFactory");
    msc.setSqlSessionTemplateBeanName("dataSource1SqlSessionFactory");
    msc.setBasePackage("demo.mybatisspring.mapper.ds1");
    return msc;
}

然后,错误发生

file [C:\...target\classes\demo\mybatisspring\mapper\ds1\UserMapper.class] required a single bean, but 2 were found:
- dataSource1SqlSessionFactory: defined by method 'sqlSessionFactoryBean' in class path resource [demo/mybatisspring/config/DataSource1Config.class]
- dataSource2SqlSessionFactory: defined by method 'sqlSessionFactoryBean2' in class path resource [demo/mybatisspring/config/DataSource2Config.class]

但是,如果我使用@MapperScan注入映射器如下,一切都会正常工作。 (当使用@MapperScan而另一个使用@Bean MapperScannerConfigurer时也工作正常)

@MapperScan(basePackages = "demo.mybatisspring.mapper.ds1", sqlSessionTemplateRef = "dataSource1SqlSessionFactory")
public class DataSource1Config {...}

@MapperScan(basePackages = "demo.mybatisspring.mapper.ds2", sqlSessionTemplateRef = "dataSource2SqlSessionFactory")
public class DataSource2Config {...}

我试图用调试模式跟踪并在互联网上搜索这么多文章,但仍无法得到答案。所以,如果有人可以帮助我吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

我认为答案就在这里。 https://mybatis.org/spring/mappers.html

  

扫描映射器无需注册所有映射器   一个。相反,您可以让MyBatis-Spring扫描您的类路径以查找   他们。

     

有三种不同的实现方式:

     

使用元素。使用注释@MapperScan   使用经典的Spring xml文件并注册   MapperScannerConfigurer和@MapperScan都是   MyBatis-Spring 1.2.0中引入的功能。 @MapperScan要求   春季3.1 +。

     

从2.0.2版开始,映射器扫描功能支持一个选项   (延迟初始化)控制延迟初始化   启用/禁用映射器bean。添加此选项的动机   支持以下功能支持的惰性初始化控制功能:   Spring Boot 2.2。此选项的默认值为false(=不使用惰性   初始化)。如果开发人员要使用延迟初始化   映射器bean,应明确将其设置为true。