如果 bean 不存在,则禁用所需的 bean

问题描述

我有一个 EventProducer,它通过 Kafka 向所有消费者发送消息。现在我希望能够通过应用程序属性禁用 Kafka。我通过 ConditionalOnProperty 禁用了 KafkaConfiguration bean。现在的问题是 EventProducer 抛出错误,因为 KafkaConfiguration bean 不存在,尽管在禁用 Kafka 时无法访问 bean。字段不存在 ConditionalOnProperty。如何忽略 EventProducer 中的 KafkaConfiguration?

@Service
@requiredArgsConstructor
public class EventProducer {

  @Value("${kafka.enabled}")
  private final boolean kafkaEnabled;
  
  private final KafkaConfiguration kafkaConfiguration;
  ...
}

@EnableKafka
@Configuration
@ConfigurationProperties(prefix = "kafka")
@ConditionalOnProperty(value = "kafka.enabled",havingValue = "true")
@requiredArgsConstructor
public class KafkaConfiguration {
  ...
}

解决方法

使用@Autowired(required = false),在这种情况下,如果kafkaConfiguration bean 不存在,null 字段保持KafkaConfiguration,这意味着字段kafkaEnabled 是多余的。

@Service
public class EventProducer {

  @Autowired(required = false)
  private KafkaConfiguration kafkaConfiguration;

  ...
}

请注意,此代码不使用构造函数自动连接(删除了 @RequiredArgsConstructor),因此该字段不再是 final