【问题标题】:Handling multiple same properties with @ConfigurationProperties使用 @ConfigurationProperties 处理多个相同的属性
【发布时间】:2021-05-18 11:04:21
【问题描述】:

我有 Properties 类和几个不同的 bean。来自application.yaml的值:

@Configuration
@Getter
@Setter
public class RabbitProperties {

    private String requestExchangeName;
    private String requestQueueName;
    private String responseExchangeName;
    private String deadLetterExchangeName;

    @Bean
    @ConfigurationProperties("rabbit-service.common-orders")
    public RabbitProperties commonOrdersRabbitProperties() {
        return new RabbitProperties();
    }

    @Bean
    @ConfigurationProperties("rabbit-service.metrics")
    public RabbitProperties metricsRabbitProperties() {
        return new RabbitProperties();
    }

    ...//more beans
}

我在另一个配置类中使用了这个Configuration

@Configuration
@RequiredArgsConstructor
public class RabbitServiceConfig {

    private final RabbitProperties commonOrdersRabbitProperties;
    private final RabbitProperties metricsRabbitProperties;
    ...//about 15 similar fields

    
    @Bean("metricsRabbitService")
    public RabbitService getMetricsRabbitService(AmqpAdmin amqpAdmin, Client rabbitClient) {
        return new RabbitService(
                metricsRabbitProperties.getRequestExchangeName(),
                metricsRabbitProperties.getRequestQueueName(),
                metricsRabbitProperties.getResponseExchangeName(),
                metricsRabbitProperties.getDeadLetterExchangeName(),
                rabbitClient,
                amqpAdmin
        );
    }

    @Bean("commonOrdersRabbitService")
    public RabbitService getCommonOrdersRabbitService(AmqpAdmin amqpAdmin, Client rabbitClient) {
        return new RabbitService(
                commonOrdersRabbitProperties.getRequestExchangeName(),
                commonOrdersRabbitProperties.getRequestQueueName(),
                commonOrdersRabbitProperties.getResponseExchangeName(),
                commonOrdersRabbitProperties.getDeadLetterExchangeName(),
                rabbitClient,
                amqpAdmin
        );
    }
...//etc

我几乎每周都会添加新的RabbitProperties 字段,所以现在它已经有大约 15-20 个相同的字段。例如,我怎样才能摆脱这些字段并将它们放到Map?我应该把这个Map 的值放在哪里并初始化它?在这里使用ConfigurationProperties 的正确方法是什么?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如果我正确理解了这个问题,您可以在 RabbitServiceConfig 类中定义一个 private final Map<String, RabbitProperties> rabbitPropertiesMap; 而不是所有字段。所有的RabbitProperties都会被注入映射到map中,key就是bean的名字。

    另一种不同的方法是用类似的东西更新RabbitProperties 的实现

    @ConfigurationProperties("rabbit-service")
    @Value
    @ConstructorBinding
    public class RabbitServiceProperties {
    
      Map<String, RabbitProperties> rabbitPropertiesMap;
    
      @Value
      static class RabbitProperties {
    
        String requestExchangeName;
        String requestQueueName;
        String responseExchangeName;
        String deadLetterExchangeName;
      }
    }
    

    这样,将发现并绑定 application.yml 中根 rabbit-service 下的所有内容。

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 2010-10-31
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多