Spring循环依赖排查:Kafka相关Bean为何出现循环依赖?
循环依赖问题分析与解决
从你提供的代码和循环依赖日志来看,表面上kafkaReceiverOptions确实没有直接依赖SpringReactorKafkaConsumer,但实际形成循环的原因大概率是配置文件中的SpEL表达式间接触发了依赖反向引用:
核心原因
你的kafkaProperties Bean通过@ConfigurationProperties(prefix = "spring.kafka.consumer")绑定配置文件属性,如果spring.kafka.consumer前缀下的任意配置项使用了SpEL表达式(比如#{springReactorKafkaConsumer}或${@springReactorKafkaConsumer.someField}),就会导致kafkaProperties在初始化时需要提前获取SpringReactorKafkaConsumer实例。
此时依赖链变成了:SpringReactorKafkaConsumer → kafkaReceiverOptions → kafkaProperties → SpringReactorKafkaConsumer,最终触发循环依赖检测。
排查与解决步骤
- 检查你的
application.properties或application.yml文件,定位所有spring.kafka.consumer.开头的配置项,确认是否存在引用springReactorKafkaConsumer的SpEL表达式。 - 移除该SpEL引用,或者调整业务逻辑避免这种跨Bean的配置依赖。
如果确认配置文件中没有这类SpEL,还可以排查以下场景:
- 检查
ReceiverOptions.create(kafkaProperties)方法内部是否有隐式触发Spring上下文获取的逻辑(Reactor Kafka官方实现通常不会)。 - 确认Spring版本是否存在已知的循环依赖检测bug(建议使用当前Spring Boot稳定版)。
内容的提问来源于stack exchange,提问作者ByeBye
相关产品推荐
相关产品推荐

