为什么要显式定义 KafkaTemplate bean?

Why explictly define KafkaTemplate beans?

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 引导,您甚至不需要创建 ProducerFactory bean。 auto-configuration 会为您解决这个问题: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 at runtime.