首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在SpringBoot中以编程方式创建bean?

如何在SpringBoot中以编程方式创建bean?

提问于 2018-03-16 06:35:44
回答 2关注 0查看 1.4K

我有一个应用程序,它具有许多在application.properties中列出的数据源设置。我有一个@ConfigurationProperties类来加载这些设置。现在我想从这个ConfigurationProperties类中获取值,并使用它们即时创建DataSource bean。我试过使用@PostConstruct并实现BeanFactoryPostProcessor。但是,使用BeanFactoryPostProcessor,处理似乎发生得早 - 在我的ConfigurationProperties类被填充之前。如何使用Spring Boot即时读取属性并创建DataSource bean?

以下是我的application.properties的样子:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
@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一样。

代码语言:javascript
复制
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    System.out.println("clients: " + CLIENT_DATASOURCES);
}

使用Spring Boot即时创建数据源的最佳方式是什么?

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档