Когда заполнитель @Value заменяется реальным значением из конфигурационного файла в среде Spring - PullRequest
0 голосов
/ 28 октября 2019

В моем весеннем приложении я хотел бы загрузить почти всю конфигурацию из базы данных. Это достигается с помощью PropertyPlaceholderConfigurer, который использует DatabaseConfiguration в качестве свойств. Это работает правильно.

Но если я хочу загрузить свои свойства из базы данных, я должен сначала настроить соединение с базой данных, которое будет загружено из файла свойств. Я думаю, что решением было бы настроить 2nd PropertyPlaceholderConfigurer для локальных файлов конфигурации (из документации кажется, что это должно быть возможно). Во время инициализации источника данных свойства с аннотацией @Value по-прежнему равны нулю, они заполняются позже. Поэтому мой вопрос заключается в том, что я должен сделать, чтобы быть уверенным, что при инициализации моего компонента источника данных все значения уже загружены из файла конфигурации?

Я пытался использовать аннотацию @DependsOn ("2n2 PropertyPlaceholderConfigurer") длякомпонент источника данных, но он не работал должным образом (вероятно, потому что это только конфигурация?)

@Value("${jdbc.url}")
private String url;

@Value("${jdbc.username}")
private String username;

@Value("${jdbc.password}")
private String password;

@Bean
@DependsOn("configDataSource")
public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer2() {
    PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
    ppc.setSystemPropertiesModeName("SYSTEM_PROPERTIES_MODE_OVERRIDE");
    ppc.setPlaceholderPrefix("$db-property");
    DatabaseConfiguration databaseConfiguration = new DatabaseConfiguration(dataSource, "DOMAIN_CONFIG",
            "CONFIG_NAME",
            "CONFIG_VALUE");
    ppc.setProperties(ConfigurationConverter.getProperties(databaseConfiguration));
    return ppc;
}

@Bean("configDataSource")
@DependsOn("filePropertyPlaceholder")
public DataSource configDataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("org.postgresql.Driver");
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);

    return dataSource;
}

@Bean("filePropertyPlaceholder")
public PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setLocations(DEFAULT_CONFIG_FILES);
    return configurer;
}
...