Сопоставление массива свойств при весенней загрузке и внедрение в область действия прототипа - PullRequest
0 голосов
/ 25 февраля 2020

Я очень новичок в весенней загрузке, и вот как выглядит мой yaml

configs:
    - 
      collection: col1
      groupId: groupId1
      topic: topic1
    - 
      collection: col2
      groupId: groupId2
      topic: topic2

Я хотел бы иметь 3 класса с областью действия, определенной в качестве прототипа, и использовать свойство из yaml примерно так:

@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class mongoListener {


    public mongoListener(@Value("${config.collection}") String collectionName) {
        //do something
    }
}

Аналогичным образом, есть еще 2 класса, которые будут использовать groupID и topi c. Я застрял здесь, как проектировать.

Будет очень полезно, если кто-нибудь сможет объяснить, как этого добиться.

1 Ответ

0 голосов
/ 26 февраля 2020

Пожалуйста, попробуйте:

  • Поместите ваш application.yaml, который состоит из вашей конфигурации yaml, в /src/main/resources/.
  • Используйте свойство с пометкой @Value, например:
public mongoListener(@Value("${configs[0].collection}") String collectionName) {
    // collectionName is 'col1'
    //do something
}

[РЕДАКТИРОВАТЬ 1]

Вы можете создавать singleton бинов, отличающихся друг от друга по имени, например:

@Configuration
public class MyConfiguration {

    @Bean("mongoListener_A")
    public mongoListener mongoListener_A(@Value("${configs[0].collection}") String collectionName) {
        return new mongoListener(collectionName);
    }

    @Bean("mongoListener_B")
    public mongoListener mongoListener_B(@Value("${configs[1].collection}") String collectionName) {
        return new mongoListener(collectionName);
    }

    // ... and so on
}

[РЕДАКТИРОВАТЬ 2]

Вы можете считывать свои конфигурации yaml в java объекты, используя аннотацию @ConfigurationProperties.

@Data //lombok annotation.
@Component("myConfigs")
@ConfigurationProperties
public class Configs {

    private final List<Config> configs;

    @Data //lombok annotation.
    public static class Config {

        private String collection;
        private String groupId;
        private String topic;

    }
}

Вы можете создать свой mongoListener с от таких объектов, как:

@Configuration
public class MyConfiguration {

    @Bean
    public List<mongoListener> mongoListeners(@Qualifier("myConfigs") Configs configs) {
        return configs.getConfigs().stream()
                .map(Config::getCollection)
                .map(mongoListener::new)
                .collect(Collectors.toList());
    }

    // ... and so on
}

Бины по-прежнему singleton, но вы можете создать произвольное количество экземпляров в зависимости от вашего файла yaml.

См. Также
Использование YAML для внешних свойств - Справочная документация по загрузке пружин Руководство с инструкциями
Spring @Value с разбиением массива и получением первого значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...