循环依赖:
A类引用了B,B类引用了A,像这种循环着依赖就是循环依赖;
对于这种配置不会报错
<bean id="instanceA" class="com.zy.entities.InstanceA"><property name="instanceB" ref="instanceB"></property></bean><bean id="instanceB" class="com.zy.entities.InstanceB"><property name="instanceA" ref="instanceA"></property></bean>
对于这种配置会报错(Error creating bean with name 'instanceA': Requested bean is currently in creation: Is there an unresolvable circular reference?)
<bean id="instanceA" class="com.zy.entities.InstanceA"><constructor-arg name="instanceB" ref="instanceB"></constructor-arg>
</bean>
<bean id="instanceB" class="com.zy.entities.InstanceB"><constructor-arg name="instanceA" ref="instanceA"></constructor-arg>
</bean>
在了解生命周期
doGet()方法:
1、解析别名
final String beanName = transformedBeanName(name);
2、从单例缓冲池中获取对象(第一次获取不到)
Object sharedInstance = getSingleton(beanName);
3、判断如果需要创建的bean是原型(非单例),就会抛出异常;
4、判断当前容器是否有父工厂,(有由父工厂加载)
5、合并bean定义(如果类似下面的这种配置,就需要合并bean定义)
<bean id="xx" class="com.zy.entities.InstanceB" abstract="true"></bean><bean id="xx2" class="com.zy.entities.InstanceA" parent="xx"></bean>
代码
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
6、调用dependson依赖检查(比如下面这种配置就会报错)
@DependsOn("InstanceB")@Beanpublic InstanceA instanceA(){return new InstanceA();}@DependsOn("InstanceA")@Beanpublic InstanceB instanceB(){return new InstanceB();}
6、创建实例,如果是单例,调用
getSingleton(beanName, new ObjectFactory<Object>() {}