在Spring Boot中映射属性数组并将其注入原型作用域

时间:2020-02-25 18:34:33

标签: spring spring-boot

我是春季靴的新手,这是我的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和topic。我在这里停留在如何设计上。

如果任何人都可以解释如何实现这一目标,将会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

请尝试:

  • 将包含yaml配置的application.yaml放入/src/main/resources/
  • 通过@Value注释使用属性,例如:
public mongoListener(@Value("${configs[0].collection}") String collectionName) {
    // collectionName is 'col1'
    //do something
}

[编辑1]

您可以创建singleton个名称互不相同的bean,例如:

@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]

您可以使用@ConfigurationProperties批注将yaml配置读入java对象。

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

bean仍然是singleton,但是您可以根据yaml文件创建任意数量的实例。

另请参见
Use YAML for External Properties - Spring Boot Reference Documentation “How-to” Guides
Spring @Value with arraylist split and obtain the first value