如何解决Spring Boot集成Redis时的循环依赖报错_检查RedisConfig配置类的依赖注入

小明大大_9545

小明大大_9545

2026-07-04

349人浏览

原创

redisconfig中禁止构造器注入业务service、禁止@autowired自身声明的redistemplate、禁止注入genericobjectpoolconfig;应仅配置基础设施,用方法参数注入依赖,保持无状态。

如何解决spring boot集成redis时的循环依赖报错_检查redisconfig配置类的依赖注入

RedisConfig里用构造器注入了Service会导致循环依赖

Spring Boot启动时检测到循环依赖,如果源头在RedisConfig类,大概率是因为你在配置类里直接通过构造器注入了业务Service(比如UserServiceImpl),而该Service又反过来依赖RedisTemplate或StringRedisTemplate——这就形成了A→B→A闭环。

这种写法看似“解耦”,实则把原本松散的依赖链硬生生拧成了死结。Spring在创建RedisConfig前必须先准备好它要注入的Service,但那个Service又需要RedisTemplate,而RedisTemplate又依赖RedisConfig(比如自定义序列化器、连接工厂等)。

  • 不要在RedisConfig中构造器注入任何业务Service或Repository
  • 如果真要复用业务逻辑(极少见),改用@Lazy修饰构造器参数,例如:public RedisConfig(@Lazy UserService userService)
  • 更合理的做法是把业务逻辑完全移出配置类,让RedisConfig只负责RedisConnectionFactory、RedisTemplate、GenericObjectPoolConfig等基础设施的声明

RedisConfig里@Autowired字段注入了RedisTemplate本身

你可能在RedisConfig里写了类似这样的代码:

Spring Boot Actuator Analyzer
Spring Boot Actuator Analyzer

分析Spring Boot Actuator端点的安全性、健康检查、指标暴露及生产配置——审计信息、健康状态和自定义端点。

下载
@Configuration
public class RedisConfig {
    @Autowired
    private RedisTemplate<string object> redisTemplate; // ❌ 错误:自己依赖自己

    @Bean
    public RedisTemplate<string object> redisTemplate(RedisConnectionFactory factory) {
        // ...
    }
}
</string></string>

这会导致Spring在准备创建redisTemplate Bean前,先尝试注入已存在的redisTemplate,但此时它还没造出来——典型的“自己等自己”。这个错误在Spring Boot 2.6+会直接失败,因为默认禁用了循环引用。

  • 配置类内部不要@Autowired任何正在被@Bean声明的同类型实例
  • 如需在@Bean方法内复用其他Bean,用方法参数注入,Spring会自动解析:public RedisTemplate redisTemplate(RedisConnectionFactory factory, ObjectMapper objectMapper)
  • 如果非要用字段注入,确保字段类型和@Bean返回类型不一致(比如注入StringRedisTemplate,但声明RedisTemplate<string object></string>)

检查GenericObjectPoolConfig是否被意外注入进RedisConfig

有些开发者为了“精细化控制连接池”,会在RedisConfig里手动@Autowired一个GenericObjectPoolConfig,再传给LettuceClientConfigurationBuilder。但这个类本身不是Spring管理的Bean,也不会被自动注册——结果就是NullPointerException或间接触发循环依赖检测(因为Spring试图用代理/工厂兜底)。

  • GenericObjectPoolConfig应该用new创建,而不是注入;它只是个普通POJO
  • 正确姿势是:在@Bean方法里构造并配置它,然后交给LettucePoolingClientConfiguration.builder().poolConfig(...)
  • 如果你看到报错堆栈里有GenericObjectPoolConfig和RedisConfig反复出现,基本可以断定是这里出了问题

为什么加了spring.main.allow-circular-references=true也不行

开启允许循环引用只能绕过Spring的检测机制,但不能解决根本问题。如果RedisConfig里存在上述任一写法,即使配置了spring.main.allow-circular-references=true,应用仍可能在运行时抛出BeanCurrentlyInCreationException或NullPointerException——因为依赖关系依然不满足初始化条件。

  • 这个配置只是“睁一只眼”,不是“治本之药”
  • 它对字段/Setter注入的单例Bean有效,但对构造器注入、原型Bean、或配置类内部自引用完全无效
  • 真正要做的,是让RedisConfig保持“无状态”:不持有业务对象,不反向依赖自身声明的Bean,不参与业务流程编排

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2571

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

477

25

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4509

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4075

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7552

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7442

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习