Spring @Bean方法没有执行(被冲掉)



本文解决的问题点:

1、自定义的kafkaTemplate()方法没有执行

2、加了注解@Bean没有执行


背景

不用springboot 自动装配的kafka,想自定义kafka template,就是自己注入kafka的配置参数,如

@Configuration public class KafkaConfig {

    @Value("${kafka.broker.list}")
    private String bootstrapServer;

    @Value("${kafka.consumer.group.id}")
    private String groupId;

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        //创建配置的Map
        Map<String, Object> properties = new HashMap<>();
        //kafka集群地址 [ host:port,host:port ]
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
        //key 对应的序列化方式
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        //value 对应的序列化方式
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        //设置是否接收反馈,value必须设置为字符串类型的 1
        properties.put(ProducerConfig.ACKS_CONFIG, "1");
        //设置重试次数
        properties.put(ProducerConfig.RETRIES_CONFIG, 0);
        //设置批处理缓冲大小
        properties.put(ProducerConfig.BATCH_SIZE_CONFIG, 20000000);
        //设置生产者缓冲区大小
        properties.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
        //设置clientId,用于发送给客户端的字符串,用于找日志
        properties.put(ProducerConfig.CLIENT_ID_CONFIG, "kafka.client.demo.id");
        //设置客户端请求的超时时间
        properties.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 60000);
        //创建ProducerFactory
        ProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<>(properties);
        //创建KafkaTemplate
        KafkaTemplate<String, String> kafkaTemplate = new KafkaTemplate<>(producerFactory);
        //返回
        return kafkaTemplate;
    } }

按理来讲,这里类加了@Configuration
方法上也加了@Bean
服务启动的之后这个方法 kafkaTemplate() 应该被执行,可是却死活没有进来,各种排查,无效!


解决办法

在服务启动类加上配置

@SpringBootApplication(exclude = KafkaAutoConfiguration.class)


原因

经排查spring执行了自动装配

org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration#kafkaTemplate

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({KafkaTemplate.class})
@EnableConfigurationProperties({KafkaProperties.class})
@Import({KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class})
public class KafkaAutoConfiguration {
    private final KafkaProperties properties;

    public KafkaAutoConfiguration(KafkaProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean({KafkaTemplate.class})
    public KafkaTemplate<?, ?> kafkaTemplate(ProducerFactory<Object, Object> kafkaProducerFactory, ProducerListener<Object, Object> kafkaProducerListener, ObjectProvider<RecordMessageConverter> messageConverter) {
        KafkaTemplate<Object, Object> kafkaTemplate = new KafkaTemplate(kafkaProducerFactory);
        messageConverter.ifUnique(kafkaTemplate::setMessageConverter);
        kafkaTemplate.setProducerListener(kafkaProducerListener);
        kafkaTemplate.setDefaultTopic(this.properties.getTemplate().getDefaultTopic());
        return kafkaTemplate;
    }

因此自定义的bean就没有执行,因为spring配置了冲突只加载一个

spring:
  main:
    allow-bean-definition-overriding: true

所以我们要禁止这个自动装配

只需在启动类上加

@SpringBootApplication(exclude = KafkaAutoConfiguration.class)


延伸

类似的redis,mq,mysql等需要自定义的可以去掉自动装配,避免别冲掉

@SpringBootApplication(exclude = RedisAutoConfiguration.class)
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@SpringBootApplication(exclude = MongoAutoConfiguration.class)

// 多个时可以这样
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值