Solon v3.2.1

问题:产生 Bean 循环依赖怎么办?

</> markdown

目前产生 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(){
    
    }
}