特征:启动直接报BeanCurrentlyInCreationException
代码示例:
@Service
public class OrderService {
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) { // 构造器注入
this.paymentService = paymentService;
}
}
@Service
public class PaymentService {
private final OrderService orderService;
public PaymentService(OrderService orderService) { // 构造器注入
this.orderService = orderService;
}
}
原理:Spring在实例化阶段必须同时满足两个Bean的构造参数依赖
特征:启动可能成功但运行时报NPE
核心机制:Spring通过三级缓存(singletonFactories)提供早期对象引用
典型场景:@Async
/@Transactional
等AOP注解引发的循环依赖
优势:
✅ 快速绕过Spring Boot 2.6+的循环依赖检查
⚠️ 风险:掩盖架构设计缺陷,仅建议紧急修复使用
@Service
public class UserService {
@Lazy // 关键注解
@Autowired
private RoleService roleService;
}
原理:通过代理对象延迟真实Bean的初始化
最佳实践:
✅ 符合依赖倒置原则
✅ 彻底消除循环依赖链
重构策略:
OrderPaymentFacade
统一入口# Maven依赖树分析
mvn dependency:tree -Dincludes=com.yourpackage
@SpringBootTest
public class CircularDependencyTest {
@Autowired private ApplicationContext context;
@Test
void checkBeans() {
assertDoesNotThrow(() -> {
context.getBean(OrderService.class);
context.getBean(PaymentService.class);
});
}
}
@ArchTest
static final ArchRule no_cycles =
slices().matching("com.example.(*)").should().beFreeOfCycles();
行业警示:阿里巴巴《Java开发手册》明确反对非必要循环依赖。建议修复后执行以下操作:
- SonarQube代码异味扫描
- 架构评审会议
- 依赖关系可视化审计(推荐使用Spring Boot Actuator)