前言
构造器注入循环依赖:
示例:
@Service
public class A {
public A(B b) {
}
}
@Service
public class B {
public B(A a) {
}
}
说明:
构造器注入构成的循环依赖spring是不能解决的。
field属性注入(setter方法注入)循环依赖
示例
@Service
public class A {
@Autowired
private B b;
}
@Service
public class B {
@Autowired
private A a;
}
- prototype field属性注入构成的循环依赖,spring是可以解决的。
- 非单例bean默认不会初始化,使用时才会去初始化,故服务启动时不会报错,只有使用时才会报错。
prototype field属性注入循环依赖
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Service
public class A {
@Autowired
private B b;
}
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Service
public class B {
@Autowired
private A a;
}
prototype field属性注入构成的循环依赖,spring是不能解决的。
Spring是如何解决field属性注入(setter方法注入)带来循环依赖的问题呢?
Spring创建Bean的流程:
创建单例bean的核心方法:
createBeanInstance
:实例化对象,调用对象的构造方法实例化对象populateBean
:填充依赖的其它bean,对依赖的bean进行注入(@Autowired
),这里很容易出现bean的循环依赖。initializeBean
:初始化bean,回调initMethod
、InitializingBean
等方法。
Spring容器针对bean的三级缓存:
Spring采用三级缓存的模式来解决单例bean之间循环依赖的问题。
参考: