Spring循环依赖与@Async代理冲突事件报告:raw version as part of a circular reference,but has eventually been wrapped.
1. 事件概述
| 关键信息 | 详情 |
|---|---|
| 发生环境 | 预生产环境(Spring MVC 4.3.9) |
| 报错特征 | BeanCurrentlyInCreationException + 循环依赖警告 |
| 触发条件 | 循环依赖链中的Service使用@Async注解 |
| 影响范围 | 服务启动失败,涉及一些service及相关依赖链 |
2. 错误现象
关键错误日志
org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name '...Service':
Bean has been injected into other beans [...] in its raw version as part of a circular reference,
but has eventually been wrapped.This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.
3. 根本原因分析
冲突机制
- 循环依赖处理
Spring通过三级缓存暴露原始对象(raw instance)临时解决循环依赖 @Async代理需求- 需要生成CGLIB/JDK动态代理
- 代理生成时机晚于循环依赖注入 → 导致其他Bean持有原始对象
- 不一致状态
- 注入的是原始对象(无异步能力)
- 实际容器中存放的是代理对象(有异步能力)
4. 解决方案
- 使用**@Lazy** 延迟注入,确保获取最终代理对象
- 删除
@Async异步逻辑 - 新增service打破循环依赖
5.经验总结
-
避免在循环依赖的Bean中使用以下注解:
-
@Async -
@Transactional -
其他需要代理的AOP增强
-
根本原因是不应该循环依赖
2025-05-09
GitHub 登录
Gitee 登录
QQ 登录