多个数据源配置,环境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配置完成之后是可以注入的。