我想确保 MyKafkaProducer bean 仅在加载
KafkaAutoConfiguration
时才激活,因此我创建了如下代码:
@Service
@ConditionalOnBean(KafkaAutoConfiguration.class)
@RequiredArgsConstructor
public class MyKafkaProducer {
private final KafkaTemplate<String, KafkaEntity> kafkaTemplate;
// omitted...
}
我检查了在 http://localhost:8080/actuator/beans 运行代码后创建的 bean 列表。
KafkaAutoConfiguration
确实被创建了,如下所示。MyKafkaProducer
但是,没有被创建。太奇怪了。
"org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration": {
"aliases": [],
"scope": "singleton",
"type": "org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration",
"dependencies": [
"spring.kafka-org.springframework.boot.autoconfigure.kafka.KafkaProperties"
]
},
我将代码中的
@ConditionalOnBean
更改为 @ConditionalOnMissingBean
并重新运行。这次,KafkaAutoConfiguration
和kafkaDlrObserver
bean都创建成功了。
"org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration": {
"aliases": [],
"scope": "singleton",
"type": "org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration",
"dependencies": [
"spring.kafka-org.springframework.boot.autoconfigure.kafka.KafkaProperties"
]
},
"kafkaDlrObserver": {
"aliases": [],
"scope": "singleton",
"type": "com.my.project.kafka.MyKafkaProducer",
"resource": "file [/target/classes/com/my/project/kafka/MyKafkaProducer.class]",
"dependencies": [
"kafkaProducer",
"resultMessageFactory"
]
},
问题:
KafkaAutoConfiguration
,这很奇怪,因为它显示在bean列表中。这是为什么?来自 ConditionalOnBean
类的
文档:
该条件只能匹配应用程序上下文迄今为止已处理的 bean 定义,因此,强烈建议仅在自动配置类上使用此条件。
将
@Conditional...
注释放在 @Service
或其他组件类上(如示例中所示)是不可靠的。
相反,您应该在
@Bean
类上使用 @AutoConfiguration
方法创建 bean,如下所示:
@RequiredArgsConstructor
public class MyKafkaProducer {
private final KafkaTemplate<String, KafkaEntity> kafkaTemplate;
// omitted...
}
@AutoConfiguration
@ConditionalOnBean(KafkaAutoConfiguration.class)
public class MyKafkaConfiguration {
@Bean MyKafkaProducer myKafkaProducer(...) {
return new MyKafkaProducer(...);
}
}
有关创建自动配置类的更多信息,请参阅 Spring Boot 文档。