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; } }
日拱一卒无有尽,功不唐捐终入海