目前产生 Bean 循环依赖的有两种可能： 


### 1、由构造函数产生的依赖

像下面这个示例：ACom 构造时，依赖 BCom；BCom 构造时，依赖 ACom： 

```java
@Component
public class ACom {
    public ACom(BCom b) {
    }
}

@Component
public class BCom {
    public BCom(ACom a) {
    }
}
```

像这种可能性比较小，可以把构造参数注入，改成字段注入可破解。

```java
@Component
public class ACom {
    @Inject
    BCom b;
}

@Component
public class BCom {
    @Inject
    ACom a;
}
```


### 2、由初始化的依赖


像下面这个示例：ACom 初始化时，依赖 BCom；BCom 初始化时，依赖 ACom： 

```java
@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）。当出现相互依赖情况时，会异常提示。

可以给初始化手动添加顺序：

```java
@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(){
    
    }
}
```

