Как я могу создать список бобов NewTopic в весенней конфигурации? - PullRequest
0 голосов
/ 22 марта 2019

Я настраиваю 10 тем Кафки в моем файле yaml, и мне нужно создать все темы при запуске приложения. Но я не понимаю, как я могу сделать это с помощью List. Я могу создать один боб:

@Bean
public NewTopic newTopic() {
    return new NewTopic("topic-name", 5, (short) 1);
}

Но теперь у меня есть список конфигов:

@PostConstruct
public void init(){
    Map<String, TopicProperties.Topic> topics = this.topics.getTopics();
    for (Map.Entry<String, TopicProperties.Topic> topicEntry : topics.entrySet()) {

        TopicProperties.Topic topic = topicEntry.getValue();

        String topicName = topic.getTopicName();
        int partitions = topic.getNumPartitions();
        short replicationFactor = topic.getReplicationFactor();

        //how can I create new bean of NewTopic?
    }

}

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вы должны определить пользовательские BeanDefinitionRegistryPostProcessor:

@Configuration
public class TopicsConfiguration {

    List<Topic> topics = ...

    @Bean
    public BeanDefinitionRegistryPostProcessor topicBeanDefinitionRegistryPostProcessor() {
        return new BeanDefinitionRegistryPostProcessor() {
            @Override
            public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
                topics.forEach(topic -> beanDefinitionRegistry.registerBeanDefinition("Topic" + topic.getName(), createTopicBeanDefinition(topic)));
            }

            @Override
            public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
            }
        };
    }

    private static BeanDefinition createTopicBeanDefinition(Topic topic) {
        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setBeanClass(TopicBean.class);
        bd.getPropertyValues().add("name", topic.getName());

        return bd;
    }
}

0 голосов
/ 22 марта 2019
  1. Вам необходимо реализовать ContextCustomizer
  2. Получить ссылку на ConfigurableListableBeanFactory
  3. и вручную вызовите ConfigurableListableBeanFactory.initializeBean ()
  4. и ConfigurableListableBeanFactory.registerSingleton ()

Я не думаю, что есть простой способ с помощью классических весенних аннотаций ..

Начальную точку можно получить из Контекстная иерархия в тестах на основе Spring Boot

...