Этот действительно озадачивает меня.У меня есть приложение Spring Boot (2.1.2), где я управляю двумя источниками данных через MyBatis и Spring.У меня есть несколько картографов MyBatis, и каждый из них настроен на использование определенного источника данных.Код для этой конфигурации приведен ниже:
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class MyBatisConfig {
private static final String POSTGRES_SESSION_FACTORY = "postgresSessionFactory";
private static final String MYSQL_SESSION_FACTORY = "mySqlDbSessionFactory";
@Bean(name = POSTGRES_SESSION_FACTORY, destroyMethod = "")
@Primary
public SqlSessionFactoryBean postgresSessionFactory(
@Qualifier(DataSourceConfig.PRIMARY_DATA_SOURCE) final DataSource oneDataSource,
ApplicationContext applicationContext) throws Exception {
final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
sqlSessionFactoryBean.setDataSource(oneDataSource);
SqlSessionFactory sqlSessionFactory;
sqlSessionFactory = sqlSessionFactoryBean.getObject();
sqlSessionFactory.getConfiguration().addMapper(Mapper1.class);
sqlSessionFactory.getConfiguration().addMapper(Mapper2.class);
return sqlSessionFactoryBean;
}
@Bean(name = MYSQL_SESSION_FACTORY, destroyMethod = "")
public SqlSessionFactoryBean mySqlSessionFactory(
@Qualifier(DataSourceConfig.SECONDARY_DATA_SOURCE) final DataSource anotherDataSource,
ApplicationContext applicationContext) throws Exception {
final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config-sql.xml"));
sqlSessionFactoryBean.setDataSource(anotherDataSource);
final SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
sqlSessionFactory.getConfiguration().addMapper(Mapper3.class);
return sqlSessionFactoryBean;
}
@Bean
public MapperFactoryBean<Mapper1> accountMapperFactory(@Qualifier(POSTGRES_SESSION_FACTORY) final SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
MapperFactoryBean<Mapper1> factoryBean = new MapperFactoryBean<>(Mapper1.class);
factoryBean.setSqlSessionFactory(sqlSessionFactoryBean.getObject());
return factoryBean;
}
@Bean
public MapperFactoryBean<Mapper2> domainMapperFactory(@Qualifier(POSTGRES_SESSION_FACTORY) final SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
MapperFactoryBean<Mapper2> factoryBean = new MapperFactoryBean<>(Mapper2.class);
factoryBean.setSqlSessionFactory(sqlSessionFactoryBean.getObject());
return factoryBean;
}
@Bean
public MapperFactoryBean<Mapper3> usageMapperFactory(@Qualifier(MYSQL_SESSION_FACTORY) final SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
MapperFactoryBean<Mapper3> factoryBean = new MapperFactoryBean<>(Mapper3.class);
factoryBean.setSqlSessionFactory(sqlSessionFactoryBean.getObject());
return factoryBean;
}
}
Если я использую свой отладчик, я очень могу сказать, что во время инициализации этих bean-компонентов все они указывают на правильный источник данных.(SqlSessionFactorys Mapper1 и Mapper2 подключаются к источнику данных postgres, SqlSessionFactory Mapper3 подключается к источнику данных mysql.
Но странным образом, когда они внедряются в службу, все три Mappers подключаются к источнику данных postgres.на данный момент.
Сервис и внедрение довольно просты:
@Autowired private Mapper1 mapper1;
@Autowired private Mapper2 mapper2;
@Autowired private Mapper3 mapper3;
Однако, когда я вызываю сервис и останавливаю его с помощью отладчика, я вижу, что mapper3 подключен не к томуисточник данных (postgres).
Есть идеи? Нужна дополнительная информация?