Spring循环依赖与@Async代理冲突事件报告:raw version as part of a circular reference,but has eventually been wrapped.

文章来源原创   作者:临窗旋墨   发布时间:2025-05-09   阅读:82   标签:springmvc,代码规范 分类:springmvc 专题:编码随手记

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. 根本原因分析

冲突机制
  1. 循环依赖处理
    Spring通过三级缓存暴露原始对象(raw instance)临时解决循环依赖
  2. @Async代理需求
    • 需要生成CGLIB/JDK动态代理
    • 代理生成时机晚于循环依赖注入 → 导致其他Bean持有原始对象
  3. 不一致状态
    • 注入的是原始对象(无异步能力)
    • 实际容器中存放的是代理对象(有异步能力)

4. 解决方案

  1. 使用@Lazy 延迟注入,确保获取最终代理对象
  2. 删除@Async异步逻辑
  3. 新增service打破循环依赖

5.经验总结

  • 避免在循环依赖的Bean中使用以下注解

  • @Async

  • @Transactional
  • 其他需要代理的AOP增强

  • 根本原因是不应该循环依赖

2025-05-09


发表评论

目录