Spring boot @ConditionalOnBean 未检测到 AutoConfiguration bean

问题描述 投票:0回答:1

我想确保 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列表中。这是为什么?
spring-boot javabeans spring-bean spring-autoconfiguration
1个回答
0
投票

来自 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 文档。

© www.soinside.com 2019 - 2024. All rights reserved.