先从一级缓存拿,A第一次进来肯定拿不到,再从二级缓存中拿,二级缓存这时候也没有,就会从三级缓存中拿到对象工厂,还是nul,返回空对象singletonObject。 protected Object getSingleton(String beanName, boolean allowEarlyReference) { //根据beanName从缓存中拿实例 //先从一级缓存拿 Object singletonObject = this.singletonObjects.get(beanName); //如果bean还正在创建,还没创建完成,其实就是堆内存有了,属性还没有DI依赖注入 if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { //从二级缓存中拿 singletonObject = this.earlySingletonObjects.get(beanName); //如果还拿不到,并且允许bean提前暴露 if (singletonObject == null && allowEarlyReference) { //从三级缓存中拿到对象工厂 ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { //从工厂中拿到对象 singletonObject = singletonFactory.getObject(); //升级到二级缓存 this.earlySingletonObjects.put(beanName, singletonObject); //删除三级缓存 this.singletonFactories.remove(beanName); } } } } return singletonObject; }
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(beanName, "Bean name must not be null"); synchronized (this.singletonObjects) { //如果缓存中有,则直接返回 Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { if (this.singletonsCurrentlyInDestruction) { throw new BeanCreationNotAllowedException(beanName, "Singleton bean creation not allowed while singletons of this factory are in destruction " + "(Do not request a bean from a BeanFactory in a destroy method implementation!)"); } if (logger.isDebugEnabled()) { logger.debug("Creating shared instance of singleton bean '" + beanName + "'"); } //把beanName添加到singletonsCurrentlyInCreation Set容器中,在这个集合里面的bean都是正在实例化的bean beforeSingletonCreation(beanName); boolean newSingleton = false; boolean recordSuppressedExceptions = (this.suppressedExceptions == null); if (recordSuppressedExceptions) { this.suppressedExceptions = new LinkedHashSet<>(); } try { //如果这里有返回值,就代表这个bean已经结束创建了,已经完全创建成功 singletonObject = singletonFactory.getObject(); newSingleton = true; } catch (IllegalStateException ex) { // Has the singleton object implicitly appeared in the meantime -> // if yes, proceed with it since the exception indicates that state. singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { throw ex; } } catch (BeanCreationException ex) { if (recordSuppressedExceptions) { for (Exception suppressedException : this.suppressedExceptions) { ex.addRelatedCause(suppressedException); } } throw ex; } finally { if (recordSuppressedExceptions) { this.suppressedExceptions = null; } //bean创建完成后singletonsCurrentlyInCreation要删除该bean afterSingletonCreation(beanName); } if (newSingleton) { System.out.println("====beanName==" + beanName + "===instance end===="); //创建对象成功时,把对象缓存到singletonObjects缓存中,bean创建完成时放入一级缓存 addSingleton(beanName, singletonObject); } } return singletonObject; } } 把beanName添加到singletonsCurrentlyInCreation Set容器中,在这个集合里面的bean都是正在实例化的bean 这里会调到外部那个lamdba表达式,匿名类中createBean方法,该方法会创建完一个实例并返回,如果这里有返回值,就代表这个bean已经结束创建了,已经完全创建成功 A实例已经通过createBean()方法创建成功,则从正在实例化的bean的缓存singletonsCurrentlyInCreation中移除
A创建成功后,把A缓存到一级缓存singletonObjects中,后面会再次提到这个结论
//一级缓存添加 this.singletonObjects.put(beanName, singletonObject); //三级缓存删除 this.singletonFactories.remove(beanName); //二级缓存删除 this.earlySingletonObjects.remove(beanName);
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // Instantiate the bean. BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { //创建实例,,重点看,重要程度:5 instanceWrapper = createBeanInstance(beanName, mbd, args); } final Object bean = instanceWrapper.getWrappedInstance(); Class<?> beanType = instanceWrapper.getWrappedClass(); if (beanType != NullBean.class) { mbd.resolvedTargetType = beanType; } // Allow post-processors to modify the merged bean definition. synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try { //CommonAnnotationBeanPostProcessor 支持了@PostConstruct,@PreDestroy,@Resource注解 //AutowiredAnnotationBeanPostProcessor 支持 @Autowired,@Value注解 //BeanPostProcessor接口的典型运用,这里要理解这个接口 //对类中注解的装配过程 //重要程度5,必须看 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); } catch (Throwable ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", ex); } mbd.postProcessed = true; } } // Eagerly cache singletons to be able to resolve circular references // even when triggered by lifecycle interfaces like BeanFactoryAware. //是否 单例bean提前暴露 boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { if (logger.isTraceEnabled()) { logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references"); } //这里着重理解,对理解循环依赖帮助非常大,重要程度 5 添加三级缓存 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); } // Initialize the bean instance. Object exposedObject = bean; try { //ioc di,依赖注入的核心方法,该方法必须看,重要程度:5 populateBean(beanName, mbd, instanceWrapper); //bean 实例化+ioc依赖注入完以后的调用,非常重要,重要程度:5 exposedObject = initializeBean(beanName, exposedObject, mbd); } catch (Throwable ex) { if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { throw (BeanCreationException) ex; } else { throw new BeanCreationException( mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); } } if (earlySingletonExposure) { Object earlySingletonReference = getSingleton(beanName, false); if (earlySingletonReference != null) { if (exposedObject == bean) { exposedObject = earlySingletonReference; } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) { String[] dependentBeans = getDependentBeans(beanName); Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length); for (String dependentBean : dependentBeans) { if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) { actualDependentBeans.add(dependentBean); } } if (!actualDependentBeans.isEmpty()) { throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been " + "wrapped. This means that said other beans do not use the final version of the " + "bean. This is often the result of over-eager type matching - consider using " + "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example."); } } } } // Register bean as disposable. try { //注册bean销毁时的类DisposableBeanAdapter registerDisposableBeanIfNecessary(beanName, bean, mbd); } catch (BeanDefinitionValidationException ex) { throw new BeanCreationException( mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex); } return exposedObject; } 实例创建成功
earlySingletonExposure是true,走下面的代码,添加三级缓存
只有A创建成功后,把A缓存到一级缓存singletonObjects中,所以这时候singletonObjects里拿不到A,会进入if,添加匿名类和beanName的对应关系到三级缓存。 //添加匿名类和beanName的对应关系到三级缓存 this.singletonFactories.put(beanName, singletonFactory); //从二级缓存删除 this.earlySingletonObjects.remove(beanName); 这个匿名类就是A这个bean,只是这个bean没有属性,因为还没有执行到ioc依赖注入的方法populateBean() getEarlyBeanReference(beanName, mbd, bean),循环所有SmartInstantiationAwareBeanPostProcessor类型的BeanPostProcessor类,返回bean
这个方法只是把你传进来的bean又返回给你了,什么都没做 三级缓存设置成功,走到ioc依赖注入方法,populateBean() 因为A类中依赖注入了B,所以会触发B的doGetBean() 方法,B开始从2.1步开始走一遍流程;这个时候的A的实例化还没有完成,停留在populateBean()方法,等待B去实例化。
循环依赖过程结束。
A实例化开始 调用A的无参构造函数 设置三级缓存A类对应的匿名对象 A类触发B的doGetBean()
B实例化开始 调用B的无参构造函数 设置三级缓存B类对应的匿名对象 B类触发A的doGetBean()
A实例化开始 从三级缓存中拿到A对应的匿名对象(这时后A中的B是还没有属性赋值的半成品)
B实例化结束 A实例化结束