【问题标题】:Why explictly define KafkaTemplate beans?为什么要明确定义 KafkaTemplate bean?
【发布时间】:2020-12-09 14:05:11
【问题描述】:

Spring Kafka reference documentation 建议显式地为 Kafka 模板创建 bean。我正在使用 spring-boot-starter 2.3.3 和 spring-kafka 2.5.5,我注意到您可以创建一个具有通配符类型的生产者工厂,并且自动创建 Kafka 模板 bean。这种方法的缺点是 IDE 无法再正确评估 @Autowired Kafka 模板 bean 是否实际存在。当您在 Kafka 模板中使用大量不同的值类型时,优点是配置较少。

还有其他原因我应该明确定义这些 bean 吗?

    // In a @Configuration class

    // Variant: Just define a wildcard producer
    @Bean
    public ProducerFactory<String, ?> wildcardProducerFactory(){
        return new DefaultKafkaProducerFactory<>(config, new StringSerializer(), new JsonSerializer<>());
    }

    // Variant: Define specific producer and template
    @Bean
    public ProducerFactory<String, Foo> fooProducerFactory(){
        return new DefaultKafkaProducerFactory(config, new StringSerializer(), new JsonSerializer());
    }

    @Bean
    public KafkaTemplate<String, Foo> fooKafkaTemplate(){
        return new KafkaTemplate<>(fooProducerFactory());
    }

    // Somewhere in a @Component class 
    // Usage here is the same for both variants
    @Autowired
    private KafkaTemplate<String, Foo> fooKafkaTemplate;

【问题讨论】:

  • 可能你使用的是 Spring Boot。请用更多信息扩展您的问题。 Vanilla Spring Kafka 不会自动将 KafkaTemplate 创建为 bean。框架中没有约定。这已经是 Spring Boot 的问题了。
  • @ArtemBilan 是的,你是对的,谢谢!我相应地编辑了问题。

标签: java spring-boot spring-kafka


【解决方案1】:

使用 Spring Boot,您甚至不需要创建 ProducerFactory bean。自动配置会为您解决这个问题:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-kafka

另请参阅KafkaProperties.Producer,了解如何通过配置属性提供序列化程序的更多信息。

注入 bean 时不考虑泛型:如果它的根类型匹配,那么你就可以开始了。无论如何,运行时没有任何泛型 - Java 中的类型擦除。

您可能只是对 IDE 表示感到困惑。由于这些 bean 没有在您的项目中声明,因此它不会从 Spring Boot 在运行时呈现它们的类路径中看到它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2013-10-09
    • 2021-01-10
    相关资源
    最近更新 更多