我有一个多数据源Web应用程序,具有以下技术:
我更喜欢基于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 {...}
我试图用调试模式跟踪并在互联网上搜索这么多文章,但仍无法得到答案。所以,如果有人可以帮助我吗?
感谢您的时间。
答案 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。