java - 使用 @ConfigurationProperties 处理多个相同的属性
问题描述
我有Properties
几个不同的豆类。值来自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
?
解决方案
如果我正确理解了这个问题,您可以private final Map<String, RabbitProperties> rabbitPropertiesMap;
在RabbitServiceConfig
类中定义 a 而不是所有字段。所有的RabbitProperties
都将通过注入在映射中绑定,键等于 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;
}
}
这样,rabbit-service
将发现并绑定 application.yml 中具有所描述结构的根目录下的所有内容。
推荐阅读
- r - 更改 bin 编号 `scale_*_binned()`
- java - 如何在没有 for 循环的情况下通过 2D 数组?
- php - 更新php中一行的值时,如何控制在mySQL中不重复数据
- python - 打印 src 属性返回 null,Python selenium
- javascript - 智能手机的输入按钮出现问题
- reactjs - 使用带有 create-react-app 的 hookrouter 无法更新导航更改的视图
- angular - 无法绑定到“ngForOf”,因为它不是“li”Angular 9 的已知属性
- karma-jasmine - 在 Angular9 单元测试中订阅激活的路由参数
- r - 您如何使用向量并对 R 中的数据帧中的行执行离散计算?
- sql - 返回 SQL Server 中所有符合 TRUE 条件的列