**// 一级缓存 存放创建好的bean**/** Cache of singleton objects: bean name --> bean instance */privatefinalMap<String,Object> singletonObjects =newConcurrentHashMap<>(256);**// 三级缓存 存放 bean对应的ObjectFactory 用于解决循环依赖**/** Cache of singleton factories: bean name --> ObjectFactory */privatefinalMap<String,ObjectFactory<?>> singletonFactories =newHashMap<>(16);**// 存放创建中还未完成整个生命周期的bean**/** Cache of early singleton objects: bean name --> bean instance */privatefinalMap<String,Object> earlySingletonObjects =newHashMap<>(16);
核心方法
protectedObjectdoCreateBean(finalString beanName,finalRootBeanDefinition mbd,final@NullableObject[] args)throwsBeanCreationException{// Instantiate the bean.BeanWrapper instanceWrapper =null;if(mbd.isSingleton()){
instanceWrapper =this.factoryBeanInstanceCache.remove(beanName);}if(instanceWrapper ==null){
instanceWrapper =createBeanInstance(beanName, mbd, args);}// 实例对象 也就是new出来的对象finalObject 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{// 对beanDefinition做调整的一个扩展点,在循环依赖过程中不重要可以忽略applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch(Throwable ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}
mbd.postProcessed =true;}}// 判断是否满足解决循环依赖的要求 // 1.单例 2.this.allowCircularReferences = true 3.isSingletonCurrentlyInCreation(beanName)// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.boolean earlySingletonExposure =(mbd.isSingleton()&&this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if(earlySingletonExposure){if(logger.isDebugEnabled()){
logger.debug("Eagerly caching bean '"+ beanName +"' to allow for resolving potential circular references");}// 满足要求的话放入三级缓存,放入的是一个ObjectFactory对象addSingletonFactory(beanName,()->getEarlyBeanReference(beanName, mbd, bean));}// 记录初始化bean实例的引用,后续会用到// Initialize the bean instance.Object exposedObject = bean;try{// 设置属性 以及执行一些beanPostProcessor扩展点populateBean(beanName, mbd, instanceWrapper);// 对bean进行初始化 以及执行一些beanPostProcessor扩展点
exposedObject =initializeBean(beanName, exposedObject, mbd);}catch(Throwable ex){if(ex instanceofBeanCreationException&& beanName.equals(((BeanCreationException) ex).getBeanName())){throw(BeanCreationException) ex;}else{thrownewBeanCreationException(
mbd.getResourceDescription(), beanName,"Initialization of bean failed", ex);}}// 这里会判断循环依赖注入是否成功if(earlySingletonExposure){// 从缓存中获取bean,如果发生了循环依赖,实际得到的是二级缓存中的实例(依赖对象在进行依赖注入时将当前对象三级缓存中的实例处理后放入了二级缓存),Object earlySingletonReference =getSingleton(beanName,false);if(earlySingletonReference !=null){// 判断new出来的实例和经过initializeBean()方法处理后的实例是否一样,如果一样说明整个过程是安全的,取二级缓存中的引用即可。if(exposedObject == bean){
exposedObject = earlySingletonReference;}// 判断是否允许注入原生对象,以及依赖的bean是否被成功创建elseif(!this.allowRawInjectionDespiteWrapping &&hasDependentBean(beanName)){String[] dependentBeans =getDependentBeans(beanName);Set<String> actualDependentBeans =newLinkedHashSet<>(dependentBeans.length);for(String dependentBean : dependentBeans){if(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){
actualDependentBeans.add(dependentBean);}}if(!actualDependentBeans.isEmpty()){thrownewBeanCurrentlyInCreationException(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{registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch(BeanDefinitionValidationException ex){thrownewBeanCreationException(
mbd.getResourceDescription(), beanName,"Invalid destruction signature", ex);}return exposedObject;}
/**
* Add the given singleton factory for building the specified singleton
* if necessary.
* <p>To be called for eager registration of singletons, e.g. to be able to
* resolve circular references.
* @param beanName the name of the bean
* @param singletonFactory the factory for the singleton object
*/protectedvoidaddSingletonFactory(String beanName,ObjectFactory<?> singletonFactory){Assert.notNull(singletonFactory,"Singleton factory must not be null");synchronized(this.singletonObjects){if(!this.singletonObjects.containsKey(beanName)){// 放入三级缓存this.singletonFactories.put(beanName, singletonFactory);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);}}}
// 从三级缓存获取到objectFactory对象,调用objectFactory对象的getObject()方法时内部会调用到这个方法,就是当初放入三级缓存时的lamda表达式中引用的方法/**
* Obtain a reference for early access to the specified bean,
* typically for the purpose of resolving a circular reference.
* @param beanName the name of the bean (for error handling purposes)
* @param mbd the merged bean definition for the bean
* @param bean the raw bean instance
* @return the object to expose as bean reference
*/protectedObjectgetEarlyBeanReference(String beanName,RootBeanDefinition mbd,Object bean){Object exposedObject = bean;if(!mbd.isSynthetic()&&hasInstantiationAwareBeanPostProcessors()){// 对bean进行后置处理for(BeanPostProcessor bp :getBeanPostProcessors()){if(bp instanceofSmartInstantiationAwareBeanPostProcessor){SmartInstantiationAwareBeanPostProcessor ibp =(SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);}}}// 处理后的实例,要么还是原来的bean,没有变化,要么是经过处理的bean(1.代理对象,2.用户自定义后置处理器处理后得到的对象)return exposedObject;}
/**
* Return the (raw) singleton object registered under the given name.
* <p>Checks already instantiated singletons and also allows for an early
* reference to a currently created singleton (resolving a circular reference).
* @param beanName the name of the bean to look for
* @param allowEarlyReference whether early references should be created or not
* @return the registered singleton object, or {@code null} if none found
*/@NullableprotectedObjectgetSingleton(String beanName,boolean allowEarlyReference){Object singletonObject =this.singletonObjects.get(beanName);if(singletonObject ==null&&isSingletonCurrentlyInCreation(beanName)){synchronized(this.singletonObjects){
singletonObject =this.earlySingletonObjects.get(beanName);if(singletonObject ==null&& allowEarlyReference){ObjectFactory<?> singletonFactory =this.singletonFactories.get(beanName);if(singletonFactory !=null){// 从三级缓存中取出来objectFactory对象,调用getObject()方法,获取bean对象
singletonObject = singletonFactory.getObject();// 处理完后,放入二级缓存 从三级缓存中删除this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return singletonObject;}