我有一个应用程序,它具有许多在application.properties中列出的数据源设置。我有一个@ConfigurationProperties类来加载这些设置。现在我想从这个ConfigurationProperties类中获取值,并使用它们即时创建DataSource bean。我试过使用@PostConstruct并实现BeanFactoryPostProcessor。但是,使用BeanFactoryPostProcessor,处理似乎发生得早 - 在我的ConfigurationProperties类被填充之前。如何使用Spring Boot即时读取属性并创建DataSource bean?
以下是我的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,就像我用@PostConstruct填充的CLIENT_DATASOURCES一样。
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("clients: " + CLIENT_DATASOURCES);
}
使用Spring Boot即时创建数据源的最佳方式是什么?
相似问题