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

Disable required bean if bean does not exist

我有一个 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 不存在,kafkaConfiguration 字段将保留 null,这意味着字段 kafkaEnabled 是多余的。

@Service
public class EventProducer {

  @Autowired(required = false)
  private KafkaConfiguration kafkaConfiguration;

  ...
}

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