Я думаю, что в качестве общего подхода вы могли бы рассмотреть шаблон проектирования прокси для фактической реализации источника данных.
Предположим, что DataSource
- это интерфейс, который имеет метод getConnection
по имени пользователя и паролю (другие методы на самом деле не важны, потому что этот ответ теоретический):
interface DataSource {
Connection getConnection(String user, String password);
}
Теперь, чтобы поддерживать много баз данных, вы можете захотеть предоставить реализацию источника данных, который будет выступать в качестве прокси для других источников данных, которые будут созданы на лету (как вы говорите, при вызове конечной точки).
Вот пример:
public class MultiDBDatasource implements DataSource {
private DataSourcesRegistry registry;
public Connection getConnection(String user, String password) {
UserAndPassword userAndPassword = new UserAndPassword(user, password);
registry.get(userAndPassword);
}
}
@Component
class DataSourcesRegistry {
private Map<UserAndPassword, DataSource> map = ...
public DataSource get(UserAndPassword a) {
map.get(a);
}
public void addDataSource(UserAndPassword cred, DataSource ds) {
// add to Map
map.put(...)
}
}
@Controller
class InvocationEndPoint {
// injected by spring
private DataSourcesRegistry registry;
@PostMapping ...
public void addNewDB(params) {
DataSource ds = createDS(params); // not spring based
UserAndPassword cred = createCred(params);
registry.addDataSource(cred, ds);
}
}
Пара заметок:
Вы должны "переопределить" bean-компонент DataSource, предлагаемый Spring - это можно сделать, определив свой собственный bean-компонент с таким же именем в вашей собственной конфигурации, который будет иметь приоритет над определением Spring.
Spring не создаст динамический источник данных, он будет создан из «точки вызова» (в данном случае для краткости контроллер, в реальной жизни, вероятно, какой-то сервис). в любом случае, весной будет управляться только Реестр, а не источники данных.
- Имейте в виду, что этот подход очень высокого уровня, в реальной жизни вам придется подумать о:
- Пул соединений
- Замер
- Поддержка транзакций
- Многопоточный доступ
и многое другое