场景一:
构造器注入造成循环依赖
@Component
public class Event {
private Listener listener;
public Event(Listener listener) {
this.listener = listener;
}
}
@Component
public class Listener {
private Event event;
public Listener(Event event) {
this.event = event;
}
}
项目启动时报错如下:
报错原因:
启动项目,两个bean在实例化的时候,构造函数都需要加载对方的实例,导致循环依赖;
解决方法:
避免使用构造函数注入,使用属性注入,如下:
场景二:
@DependsOn造成的
@Component
@DependsOn("event")
public class Listener {
public Listener() {
System.out.println("Listener");
}
}
@Component
@DependsOn("listener")
public class Event {
public Event() {
System.out.println("Event");
}
}
项目启动时报错如下:
报错原因:
监听者类加载时依赖于事件类,事件类加载时依赖于监听类,最终导致循环依赖
解决方法:
在使用时,避免两个类循环依赖,@DependsOn一般使用于监听者模式,在使用时,大多情况都是在监听事件源,所以一般都是事件源依赖于监听类;