SpringBoot中@ConfigurationProperties对于多层嵌套参数的正确加载方法

SpringBoot中@ConfigurationProperties对于多层嵌套参数的正确加载方法

今天想重构一下Kafka代码,将之前用@Value引入的一些参数全部替换掉,因为可读性和维护性太差,这是以前的样子。

		@Value("${spring.kafka.bootstrap-servers}")
    private String servers;
    @Value("${spring.kafka.consumer.group-id}")
    private String groupId;
    @Value("${spring.kafka.consumer.auto-offset-reset:}")
    private String reset;
    @Value("${spring.kafka.consumer.enable-auto-commit}")
    private String commit;
    @Value("${spring.kafka.consumer.max-poll-records}")
    private String records;
    @Value("${spring.kafka.consumer.max-poll-interval-ms}")
    private String intervams;
    @Value("${spring.kafka.consumer.auto-commit-interval}")
    private String interval;
    @Value("${spring.kafka.consumer.key-deserializer}")
    private String key;
    @Value("${spring.kafka.consumer.value-deserializer}")
    private String value;
    @Value("${spring.kafka.consumer.properties.sasl.mechanism:}")
    private String mechanism;
    @Value("${spring.kafka.consumer.properties.security.protocol:}")
    private String protocol;

有同学可能会问,为什么不直接用spring集成好的Kafka,因为它封装的太好,反而不能使用一些原生的接口,所以打算重构一遍代码,至于重构的过程和优化的内容,留给以后的文章去讲解,这篇只是想使用@ConfigurationProperties把参数格式化掉,可以直接提取使用,在网上搜了一些文章,写的很乱,有的甚至完全不能实现功能,最后在一通乱怼下终于符合了自己的需求,Kafka的配置参数存在多层结构,所以不能直接配置参数。


spring:
  kafka:
    bootstrap-servers: xxx.xxx.xxx.xxx:9092
    producer:
      retries: 0
      batch-size: 16384
      buffer-memory: 33554432
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: views.invoke
      auto-offset-reset: earliest
      enable-auto-commit: true
      max-poll-records: 100
      max-poll-interval-ms: 60000
      auto-commit-interval: 100
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

只要是类似于这样结构的参数,都可以参考我的写法,理论上是没有问题的。

下面是我怼出来的写法

@Component
@ConfigurationProperties(prefix = "spring.kafka")
@Getter
@Setter
public class KafkaConfig {

    private String bootstrapServers;
    private ProducerProperties producer = new ProducerProperties() ;
    private ConsumerProperties consumer = new ConsumerProperties();

    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public class ProducerProperties {
        private String retries;
        private String batchSize;
        private String bufferMemory;
        private String keySerializer;
        private String valueSerializer;
    }

    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public class ConsumerProperties {
        private String groupId;
        private String autoOffsetReset;
        private String enableAutoCommit;
        private String maxPollRecords;
        private String maxPollIntervalMs;
        private String autoCommitInterval;
        private String keyDeserializer;
        private String valueDeserializer;
    }

}

这里用到了lombok,代码结构也比较简洁,参数中间的-可以用大写来替代,spring会自动匹配的。

错误的做法

下面这种是很多文章里写的,测试了很多遍,基本获取不到参数,就能得到bootstrapServers。

@Configuration
@EnableAutoConfiguration
@Getter
@Setter
public class KafkaConfig {

    private String bootstrapServers;
    
    @Bean
    @ConfigurationProperties(prefix="spring.kafka.producer")
    public ProducerMyConfig getProducerConfig(){
        return new ProducerMyConfig();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.kafka.consumer")
    public ConsumerMyConfig getConsumerConfig(){
        return new ConsumerMyConfig();
    }

    private  class ProducerMyConfig {
        private String retries;
        private String batchSize;
        private String bufferMemory;
        private String keySerializer;
        private String valueSerializer;
    }

    private  class ConsumerMyConfig {
        private String groupId;
        private String autoOffsetReset;
        private String enableAutoCommit;
        private String maxPollRecords;
        private String maxPollIntervalMs;
        private String autoCommitInterval;
        private String keyDeserializer;
        private String valueDeserializer;
    }
}

在使用@ConfigurationProperties注解进行属性绑定时,涉及多层结构的情况下,可以通过创建嵌套类来表示多层结构,并使用@ConfigurationProperties注解进行属性绑定。例如,创建一个嵌套类来表示多层属性结构,并在该类上添加@ConfigurationProperties注解,指定对应的前缀。然后,通过在父类引入嵌套类并使用@ConfigurationProperties注解进行属性绑定。具体操作步骤如下: 首先,在父类引入嵌套类,并在该属性上添加@ConfigurationProperties注解,指定对应的前缀。例如: ``` @ConfigurationProperties(prefix = "parent") public class ParentConfig { private ChildConfig child; // Getter and Setter for child ... } ``` 然后,在父类创建一个嵌套类,表示多层属性结构,并在该类上添加@ConfigurationProperties注解,指定对应的前缀。例如: ``` @Data public class ChildConfig { private String value1; private String value2; // Getter and Setter for value1 and value2 ... } ``` 最后,在引导类使用@EnableConfigurationProperties注解指定父类,将其注入到Spring容器。例如: ``` @EnableConfigurationProperties(ParentConfig.class) @SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 这样,就可以通过将多层结构的属性值注入到父类,并在应用程序访问这些属性值。例如,使用@Autowired注解将父类注入到其他组件,并访问其的属性值。 ``` @Component public class MyComponent { @Autowired private ParentConfig parentConfig; public void doSomething() { ChildConfig childConfig = parentConfig.getChild(); String value1 = childConfig.getValue1(); String value2 = childConfig.getValue2(); // Do something with value1 and value2 ... } } ``` 这样,就可以在应用程序获取到多层结构的属性值了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringBoot学习笔记一](https://blog.csdn.net/weixin_51391532/article/details/127330905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【学习日记2023.5.30】之 管理端订单模块完善_调用百度地图优化用户端提交订单是否超出配送距离](https://blog.csdn.net/qq_42575689/article/details/130956400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值