У меня есть приложение, в котором есть несколько параметров источника данных, перечисленных в application.properties. У меня есть класс @ConfigurationProperties, который загружает эти параметры. Теперь я хочу взять значения из этого класса ConfigurationProperties и использовать их для создания DataSource beans на лету. Я попытался использовать @PostConstruct и реализовать BeanFactoryPostProcessor. Однако с помощью BeanFactoryPostProcessor обработка, похоже, произойдет раньше - до того, как будет заполнен класс ConfigurationProperties. Как я могу читать свойства и создавать DataSource beans на лету с помощью Spring Boot?
Вот что выглядит мое приложение application.properties:
ds.clients[0]=client1|jdbc:db2://server/client1
ds.clients[1]=client2,client3|jdbc:db2://server/client2
ds.clients[2]=client4|jdbc:db2://server/client4
ds.clients[3]=client5|jdbc:db2://server/client5
И мой класс ConfigurationProperties:
@Component
@ConfigurationProperties(prefix = "ds")
public class DataSourceSettings {
public static Map<String, String> CLIENT_DATASOURCES = new LinkedHashMap<>();
private List<String> clients = new ArrayList<>();
public List<String> getClients() {
return clients;
}
public void setClients(List<String> clients) {
this.clients = clients;
}
@PostConstruct
public void configure() {
for (String client : clients) {
// extract client name
String[] parts = client.split("\\|");
String clientName = parts[0];
String url = parts[1];
// client to datasource mapping
String dsName = url.substring(url.lastIndexOf("/") + 1);
if (clientName.contains(",")) {
// multiple clients with same datasource
String[] clientList = clientName.split(",");
for (String c : clientList) {
CLIENT_DATASOURCES.put(c, dsName);
}
} else {
CLIENT_DATASOURCES.put(clientName, dsName);
}
}
}
В конце этого метода @PostConstruct я хотел бы создать BasicDataSource с этими настройками и добавить его в ApplicationContext. Однако, если я попытаюсь сделать это с помощью реализации BeanFactoryPostProcessor и реализации postProcessBeanFactory, свойство "clients" будет равно null, как и CLIENT_DATASOURCES, который я заполнил с помощью @PostConstruct.
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("clients: " + CLIENT_DATASOURCES);
}
Какой лучший способ создавать источники данных "на лету" с помощью Spring Boot?