有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用@ConfigurationProperties处理多个相同的属性

我有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的正确方式是什么


共 (1) 个答案

  1. # 1 楼答案

    如果我正确理解了这个问题,您可以在RabbitServiceConfig类中定义private final Map<String, RabbitProperties> rabbitPropertiesMap;而不是所有字段。所有的RabbitProperties都将通过注入在映射中绑定,key等于bean name

    另一种不同的方法是使用以下内容更新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;
      }
    }
    

    这样,应用程序中根rabbit-service下的所有内容都将被删除。将发现并绑定具有所述结构的yml