ObjectFactory 中 会存储
- beanName
- Bean的定义
- Bean实例 : 只当进行了初始化 和 属性注入的实例,缺少循环依赖的bean 或 为初始化的bean
- Bean的工厂 :DefaultListableBeanFactory
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
中先会创建bean的实例,然后填充属性,之后会判断是否包含循环依赖,是的话会调用getSingleton 去获取早期单例引用
比如 A 类中 依赖了B ,B中又依赖了A
但Spring 扫描到A 时 -> 进行初始化 -> 然后进行属性注入 -> 发现缺少B ,尝试从缓存中取,没取到 -> 然后进行B 的初始化 -> 然后进行B的属性注入,发现缺少A ,然后尝试从缓存中取,取到了 -> 将A注入到B中,从工厂中移除本实例,然后返回实例 -> A获取到B实例,继续A的属性注入,然后下一个Bean。
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
if (bw == null) {
if (mbd.hasPropertyValues()) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
}
else {
// Skip property population phase for null instance.
return;
}
}
// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
// state of the bean before properties are set. This can be used, for example,
// to support styles of field injection.
//会执行所有的InstantiationAwareBeanPostProcessors 其中一个是 AutowiredAnnotationBeanPostProcessor, 会将属性进行注入,即执行@Autowire 和 @Value 的逻辑
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
return;
}
}
}
}
会执行所有的InstantiationAwareBeanPostProcessors 其中一个是 AutowiredAnnotationBeanPostProcessor, 会将属性进行注入,即执行@Autowire 和 @Value 的逻辑
扩展
- 为什么Spring 使用三级缓存,而不是二级缓存?
第三级缓存是Spring提供SmartInstantiationAwareBeanPostProcessor 给用户做扩展,如果用户没有实现该接口则这一层也就啥也没做,直接返回bean
Spring 本身会在populateBean 执行自己的InstantiationAwareBeanPostProcessor