Странная проблема - источник данных меняется после внедрения в службу - PullRequest
0 голосов
/ 12 июня 2019

Этот действительно озадачивает меня.У меня есть приложение 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).

Есть идеи? Нужна дополнительная информация?

...