Comment puis-je créer des haricots par programmation au Printemps de Démarrage?

J'ai une application qui a un certain nombre de paramètres de source de données figurant dans la demande.les propriétés. J'ai un @ConfigurationProperties classe qui se charge de ces paramètres. Maintenant, je veux prendre les valeurs de cette ConfigurationProperties classe et les utiliser pour créer la source de données haricots à la volée. J'ai essayé d'utiliser @PostConstruct et la mise en œuvre de BeanFactoryPostProcessor. Cependant, avec BeanFactoryPostProcessor, le traitement semble se produire au début de l'avant de mon ConfigurationProperties classe a été peuplée. Comment puis-je lire les propriétés et créer DataSource haricots à la volée avec Spring Boot?

Voici ce que mon application.propriétés ressemble:

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

Et mon ConfigurationProperties classe:

@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);
            }
        }
    }

À la fin de cette @PostConstruct méthode, j'aimerais créer un BasicDataSource avec ces paramètres et l'ajouter à la ApplicationContext. Cependant, si j'essaie de le faire en œuvre BeanFactoryPostProcessor et la mise en œuvre de postProcessBeanFactory, le clients propriété est null, comme c'est le CLIENT_DATASOURCES que j'ai rempli avec @PostConstruct.

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    System.out.println("clients: " + CLIENT_DATASOURCES);
}

Quelle est la meilleure façon de créer des sources de données à la volée avec Spring Boot?

  • C'est une vieille question, donc il mérite un vieille réponse. Ce n'est pas spécifique à Spring Boot, mais en général au Printemps. Je pense qu'il détient toujours.
InformationsquelleAutor Matt Raible | 2014-08-06