Spring如何解决循环依赖?
springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j)
@component
class A {
private B b;
}
@component
class B {
private A a;
}
类A依赖了B作为属性,类B又使用类A作为属性,彼此循环依赖。
源码理解:
//调用AbstractBeanFactory.doGetBean(),向IOC容器获取Bean,触发依赖注入的方法
protected <T> T doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
...
// 第一次getSingleton获取对象实例
// 先从缓存中取是否已经有被创建过的单例类型的Bean[没有的话就去获取半成品的,也就是earlySingletonObjects,缓存二的东西]
// 对于单例模式的Bean整个IOC容器中只创建一次,不需要重复创建
Object sharedInstance = getSingleton(beanName);
...
try {
//创建单例模式Bean的实例对象
if (mbd.isSingleton()) {
//第二次getSingleton尝试创建目标对象,并且注入属性
//这里使用了一个匿名内部类,创建Bean实例对象,并且注册给所依赖的对象
sharedInstance = getSingleton(beanName, () -> {
try {
//创建一个指定Bean实例对象,如果有父级继承,则合并子类和父类的定义
return createBean(beanName, mbd, args);
} catch (BeansException ex) {
//显式地从容器单例模式Bean缓存中清除实例对象
destroySingleton(beanName);
throw ex;
}
});
// 如果传入的是factoryBean,则会调用其getObject方法,得到目标对象
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
//IOC容器创建原型模式Bean实例对象
}
...
} catch (BeansException ex) {