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 楼答案
如果我正确理解了这个问题,您可以在
RabbitServiceConfig
类中定义private final Map<String, RabbitProperties> rabbitPropertiesMap;
而不是所有字段。所有的RabbitProperties
都将通过注入在映射中绑定,key等于bean name另一种不同的方法是使用以下内容更新
RabbitProperties
的实现这样,应用程序中根
rabbit-service
下的所有内容都将被删除。将发现并绑定具有所述结构的yml