多个数据源配置,两个mybatis配置spring value和Autowired失效

多个数据源配置,环境springboot 2.6,jdk11,Mybatis plus 3.5.1。

有个多数据源的需求,使用原来注解动态切换,但是新同事总是弄错数据库,所以我配置另一个Mybatis plus的环境。一切都很多顺利,但是使用spring Configuration配置,value和Autowired注解失效,请如何解决?

@Configuration
public class MyBatisMapperScanConfigV2 implements  DisposableBean {
    @Value("${x.dataSource.driver-class-name}")
    private String driverClassName;

    @Value("${x.dataSource.url}")
    private String url;

    @Value("${x.dataSource.username}")
    private String username;

    @Value("${x.dataSource.password}")
    private String password;

    @Autowired
    private Environment environment;

    @Bean("d3MapperScannerConfigurer")
    public MapperScannerConfigurer mapperScannerConfigurer() throws Exception {
        HikariDataSource dataSource = this.createDataSource();
        this.dataSource = dataSource;
        SqlSessionFactory standaloneSqlSessionFactory = this.createStandaloneSqlSessionFactory(dataSource);
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("cn.cnic.security.x.dao");
        mapperScannerConfigurer.setSqlSessionFactory(standaloneSqlSessionFactory);

        return mapperScannerConfigurer;
    }

    /**
     * 创建一个独立的SqlSessionFactory,连接池也独立的
     * @return
     */
    public SqlSessionFactory createStandaloneSqlSessionFactory(DataSource dataSource) throws Exception {


        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        // 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource作为数据源则不能实现切换
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage("cn.cnic.security.x.dao");    // 扫描Model
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            sessionFactory.setMapperLocations(resolver.getResources("classpath*:mapper/x/*Dao.xml"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true); //开启自动驼峰命名规则
        sessionFactory.setConfiguration(configuration);

        //
        GlobalConfig globalConfig = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        dbConfig.setIdType(IdType.AUTO);


        globalConfig.setDbConfig(dbConfig);
        sessionFactory.setGlobalConfig(globalConfig);

        return sessionFactory.getObject();
    }

    @Override
    public void destroy() throws Exception {
        if(this.dataSource != null ){
            log.info("isClosed = {},isRunning = {}",this.dataSource.isClosed(),this.dataSource.isRunning());
            this.dataSource.close();
        }
    }


    public HikariDataSource createDataSource(){
        HikariConfig config = new HikariConfig();

        dataSource.setDriverClassName(this.driverClassName);
        dataSource.setJdbcUrl(this.url);
        dataSource.setUsername(this.username);
        dataSource.setPassword(this.password);

        System.out.println("driver-class-name:"+environment.getProperty("x.datasource.driver-class-name"));
        System.out.println("url:"+this.url);
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://127.0.0.1/x?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&rewriteBatchedStatements=true");
        config.setUsername("x");
        config.setPassword("x");
        config.setConnectionTestQuery("select 1");
        config.setMinimumIdle(0);
        config.setMaximumPoolSize(5);

        HikariDataSource dataSource = new HikariDataSource(config);
        return dataSource;
    }
}

注意:如果把配置写死到代码时可以运行的。我需要是需要通过配置文件读取jdbc的配置信息,并且根据开发测试环境进行切换,也可以说需要实现:spring.profiles.active。

    2,在运行测试时,spring bean配置完成之后是可以注入的。

目前通过代码写死线程池的配置,可以正常运行,不用通过注解动态切换数据库。不能读取配置个人感觉应该是Mybatis的ClassPathMapperScanner加载的太早了

配置类实现EnvironmentAware,这样你就能自己拿到Environment了,自己手动获取配置信息