Spring:单例循环依赖

Spring中的单例循环依赖解决

 

我们声明了两个类(A、B),两个类中的成员变量相互引用:然后在Spring中就会产生循环依赖(A依赖B,B依赖A)。

1 @Component
2 public class GirlFriend {
3     @Autowired
4     private BoyFriend boyFriend;
5 }
1 @Component
2 public class BoyFriend {
3     @Autowired
4     private GirlFriend girlFriend;
5 }

 

Spring对于这种情况的解决流程图如下:

 

 

Spring是否支持所有循环依赖的情况?

循环依赖的情况如下:

  构造器循环依赖(singleton、prototype两种情况)

  Setter循环依赖(singleton、prototype两种情况)

 

对于Prototype这种情况,Spring是不支持循环依赖的(在三级缓存中的Bean是不唯一的,所以支持不了Prototype)

比如下面代码:(下面两个类相互引用)(构造器循环依赖)

@Repository
@Scope(value = "prototype")
public class Company {
    private Staff staff;
    @Autowired
    public Company(Staff staff){
        this.staff = staff;
    }
}
@Repository
@Scope(value = "prototype")
public class Staff {
    private Company company;
    @Autowired
    public Staff(Company company){
        this.company = company;
    }
}

对于singleton来说是支持Setter循环依赖情况的,但是对于构造函数循环依赖还是不支持的

因为在单例Bean的创建时会执行到AbstractAutowireCapableBeanFactory类下的doCreateBean方法。

doCreateBean方法的执行流程是先创建Bean后给Bean注入属性,在创建Bean的时候调用构造方法的时候就陷入了循环依赖

比如下面代码:(下面两个类相互引用)(构造器循环依赖)

@Repository
public class Company {
    private Staff staff;
    @Autowired
    public Company(Staff staff){
        this.staff = staff;
    }
}
@Repository
public class Staff {
    private Company company;
    @Autowired
    public Staff(Company company){
        this.company = company;
    }
}

 

posted @ 2021-02-23 11:05  _kerry  阅读(150)  评论(0编辑  收藏  举报