为什么要显式定义 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.
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.