问题:产生 Bean 循环依赖怎么办?
目前产生 Bean 循环依赖的有两种可能:
1、由构造函数产生的依赖
像下面这个示例:ACom 构造时,依赖 BCom;BCom 构造时,依赖 ACom:
@Component
public class ACom {
public ACom(BCom b) {
}
}
@Component
public class BCom {
public BCom(ACom a) {
}
}
像这种可能性比较小,可以把构造参数注入,改成字段注入可破解。
@Component
public class ACom {
@Inject
BCom b;
}
@Component
public class BCom {
@Inject
ACom a;
}
2、由初始化的依赖
像下面这个示例:ACom 初始化时,依赖 BCom;BCom 初始化时,依赖 ACom:
@Component
public class ACom {
@Inject
BCom b;
@Init
public void init(){
}
}
@Component
public class BCom {
@Inject
ACom a;
@Init
public void init(){
}
}
容器对所有的初始化函数(@Init
注解函数,或者 LifecycleBean:start
实现方法),会分析依赖关系,并产生执行顺序(index)。当出现相互依赖情况时,会异常提示。
可以给初始化手动添加顺序:
@Component
public class ACom {
@Inject
BCom b;
@Init(index = 2)
public void init(){
}
}
@Component
public class BCom {
@Inject
ACom a;
@Init(index = 1)
public void init(){
}
}