在 Java(尤其是 Spring)项目里,“依赖循环”通常指 Bean 之间的循环依赖(circular dependency)。下面从 原理 → 常见场景 → 解决办法 讲清楚。
@Service
class A {
@Autowired
private B b;
}
@Service
class B {
@Autowired
private A a;
}
A 依赖 B,B 又依赖 A,形成闭环。
Spring 默认能解决:
原理(简化):
⚠️ 以下情况 Spring 解决不了,会报错:
循环依赖往往是设计问题。
方法:
@Service
class C {}
@Service
class A {
@Autowired C c;
}
@Service
class B {
@Autowired C c;
}
✅ 这是根本解决方式
@Service
class A {
private B b;
@Autowired
public void setB(B b) { this.b = b; }
}
⚠️ 只是“绕开报错”,不解决设计问题
@Service
class A {
@Lazy
@Autowired
private B b;
}
适用:
@Component
class A {
@EventListener
public void onEvent(MyEvent e) {}
}
用 事件驱动 打破强依赖。
@Service
class A {
private final B b;
public A(@Lazy B b) {
this.b = b;
}
}
Spring Boot 2.6 开始:
spring:
main:
allow-circular-references: true
⚠️ 不推荐开启,只是兼容老项目
| 情况 | 建议 |
|---|---|
| 新项目 | 重构,避免循环 |
| 老项目报错 | @Lazy 临时解决 |
| 设计混乱 | 抽服务 / 事件 |
| 构造器注入报错 | @Lazy 或改 setter |
如果你愿意,可以把 具体报错信息或代码结构贴出来,我可以直接帮你改成无循环依赖的版本。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。