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