Я хочу динамически создавать источник данных и jdbctemplate, потому что впервые не знаю имен баз данных и других свойств. Как я могу инициализировать jdbcTemplate и DataSource. Я читаю этот файл yaml и преобразую его в свой собственный объект.
Мой код конфигурации:
@Configuration
public class DataSourceConfiguration {
@Value("${datasource.config.path}")
private String datasourcePath;
private MyConf myConf;
@Getter
private Map<String, DataSource> dataSourceMap = new HashMap<>();
@Getter
private Map<String, JdbcTemplate> jdbcTemplateMap = new HashMap<>();
@PostConstruct
public void init() throws InvalidValueException {
myConf = parse();
createDataSources();
createJdbcTemplate();
}
public MyConf parse() throws InvalidValueException {
try (InputStream io = new FileInputStream(datasourcePath)) {
Representer representer = new Representer();
representer.getPropertyUtils().setSkipMissingProperties(true);
MyConf newDataSource = new Yaml(new Constructor(MyConf.class), representer).load(io);
newDataSource.validate();
return newDataSource;
} catch (IOException e) {
log.error("Initialization exception.");
throw new InitializationException(e);
} catch (YAMLException e) {
log.error("YAML parsing exception - " + e.getMessage());
throw new YAMLException("Yaml parsing exception ", e);
} catch (InvalidValueException ex) {
throw new InvalidValueException(String.format("Config is invalid -> %s ", ex.getMessage()));
}
}
private void createDataSources() {
for (DataSourceConfig dp : myConf.getDatasource()) {
dataSourceMap.put(dp.getDatabase(), DataSourceBuilder.create()
.username(dp.getUsername())
.password(dp.getPassword())
.url(dp.getJdbcUrl())
.driverClassName(dp.getDriverClassName())
.build());
}
}
private void createJdbcTemplate() {
dataSourceMap.forEach((k, v) -> jdbcTemplateMap.put(k, new JdbcTemplate(v)));
}
@Bean(name = "jdbcTemplate")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public JdbcTemplate createJdbcTemplate1(DataSource dataSource){
return jdbcTemplateMap.get("ONSUBS");
}
}
application.properties
, файл, как показано ниже.
datasource.config.path=datasource.yml
datasource yml
, как показано ниже
datasource:
- database: testDB
jdbcUrl: jdbc:oracle:thin:@//.....(I have removed now)
username: admin
password: admin
driverClassName: oracle.jdbc.OracleDriver
- database: testDB2
jdbcUrl: jdbc:oracle:thin:@//.....(I have removed now)
username: admin
password: admin
driverClassName: oracle.jdbc.OracleDriver
МойГлавный вопросПоскольку у меня будет более одного источника данных, мне нужен один и тот же jdbcTemplate. Как я могу создать их динамически в Spring загрузочной Java.
Спасибо