Java Spring 4,MyBatis,带注释的多个数据源

Java Spring 4,MyBatis,带注释的多个数据源,java,spring,mybatis,spring-annotations,Java,Spring,Mybatis,Spring Annotations,我目前使用的是一个Spring4应用程序,它使用MyBatis,并且完全由注释驱动(不能根据架构需求进行更改)。我正在尝试添加第二个数据源定义,其中包含一组完全独立的映射配置 我遇到的问题是,我无法让这两个数据源很好地配合使用 我创建了一个几乎完全相同的新类,并将@Qualifier数据添加到新文件中 类的配置如下所示: 数据源1 @Configuration @MapperScan (basePackages = "com.myproject.package1", annotationClas

我目前使用的是一个Spring4应用程序,它使用MyBatis,并且完全由注释驱动(不能根据架构需求进行更改)。我正在尝试添加第二个数据源定义,其中包含一组完全独立的映射配置

我遇到的问题是,我无法让这两个数据源很好地配合使用

我创建了一个几乎完全相同的新类,并将
@Qualifier
数据添加到新文件中

类的配置如下所示:

数据源1

@Configuration
@MapperScan (basePackages = "com.myproject.package1", annotationClass = Mapper.class)
public class DataSource1 {

  @Bean
  @Qualifier ("DS1")
  public DataSource getDataSource() {
    /* configuration loaded */
  }

  @Bean
  @Qualifier ("DS1")
  public SqlSessionFactory getSqlSessionFactory() {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(getDataSource());
    /* mapper resources added */
    return bean.getObject();
  }
}
数据源2

@Configuration
@MapperScan (basePackages = "com.myproject.package2", annotationClass = Mapper.class)
public class DataSource2 {

  @Bean
  @Qualifier ("DS2")
  public DataSource getDataSource() {
    /* configuration loaded */
  }

  @Bean
  @Qualifier ("DS2")
  public SqlSessionFactory getSqlSessionFactory() {
    SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    bean.setDataSource(getDataSource());
    /* mapper resources added */
    return bean.getObject();
  }
}
运行此操作时,我会收到如下异常消息:

org.apache.ibatis.binding.BindingException:无效的绑定语句(未找到)

如果我注释掉DS2中的数据,DS1会再次正常工作。我尝试将映射器扫描配置数据添加到另一个bean中,并将
SqlSessionFactoryBean
的名称设置为传递给它,但没有成功

建议

更新 我查看并更新了以下内容

@Bean (name = "the_factory_1")
public SqlSessionFactory getSqlSessionFactory() { /* same code */ }

@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
  MapperScannerConfigurer configurer = new MapperScannerConfigurer();
  configurer.setBasePackage("com.myproject.package1");
  configurer.setAnnotationClass(Mapper.class);
  configurer.setSqlSessionFactoryBeanName("the_factory_1");
  return configurer;
}
但是,这导致了我的错误:

找不到依赖项类型为[com.myproject.package1.mapper.MyMapper]的符合条件的bean:至少需要1个符合此依赖项autowire候选项条件的bean。依赖项批注:{}

当我调试工厂时,只调用一个
@Bean

更新2
如果我将所有内容移动到一个文件中,则一切正常。但是,这并不理想,因为我希望将
数据源
定义分开。这是我目前唯一的障碍。

请使用DAOFactory模式获取多个数据源(如DS1和DS2)的连接,并使用DAOUtil类使用您可以使用的注释提供所需的配置,它简化了配置

添加一个豆子

@Bean
public static AceMapperScannerConfigurer mapperScannerConfigurer() {
    return AceMapperScannerConfigurer.builder()
            .basePackage("com.myproject.package1")
            .build();
}
然后用@AceMapper标记映射器接口并指定sqlSessionFactory

@AceMapper(sqlSessionFactoryBeanName = "firstSqlSessionFactory")
public interface UserMapper {
 Stream<User> selectUsers();
}

@AceMapper(sqlSessionFactoryBeanName = "secondSqlSessionFactory")
public interface ClientMapper {
 Stream<Client> selectClients();
}
@AceMapper(sqlSessionFactoryBeanName=“firstSqlSessionFactory”)
公共接口用户映射器{
Stream selectUsers();
}
@AceMapper(sqlSessionFactoryBeanName=“secondSqlSessionFactory”)
公共接口客户端映射程序{
Stream selectClients();
}

我目前无法更改第一个数据源的设置方式。这是一种“如果你不遵循已经存在的内容,代码将被拒绝”的情况。我看了一下,不确定我做错了什么: