/**
* 对BeanFactory中的所有非延迟加载的单例Bean进行实例化
*/protectedvoidfinishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory){// Initialize conversion service for this context./**
* 如果容器中存在ConversionService接口的实现和conversionService名称的BeanDefinition
* 则实例化这个Bean放到容器中,默认是没有格式转换器的
* 这个接口是一个转换标准接口,可实现该接口注册到容器中进行数据的转换
* 如果加入了SpringMVC,则会自动注入一个该接口的实现,满足大部分MVC模型数据的转换
*/if(beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)&&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)){
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values./**
* 在这之前,容器中如果没有关于值处理的BeanPostProcessor,则在这注册默认的嵌入式值解析器
*/if(!beanFactory.hasEmbeddedValueResolver()){
beanFactory.addEmbeddedValueResolver(strVal ->getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early./**
* 实例化BeanFactory中的LoadTimeWeaverAware接口实现
* 这个接口可动态转化类,目前没有理解
*/
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,false,false);for(String weaverAwareName : weaverAwareNames){getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching./**
* 将临时类加载器设置为null,即停止使用
*/
beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes./**
* 到这里BeanName不会再发生变化,将其缓存起来
* @see DefaultListableBeanFactory#freezeConfiguration()
*/
beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons./**
* 这是实质性的对Bean进行实例化方法
*
* @see DefaultListableBeanFactory#preInstantiateSingletons()
*/
beanFactory.preInstantiateSingletons();}
/**
* 创建BeanName对应的Bean实例
*/@SuppressWarnings("unchecked")protected<T> T doGetBean(final String name,@Nullablefinal Class<T> requiredType,@Nullablefinal Object[] args,boolean typeCheckOnly)throws BeansException {/**
* 名称规范替换,例如别名替换为正式名
*/final String beanName =transformedBeanName(name);
Object bean;// Eagerly check singleton cache for manually registered singletons./**
* 首先从单例Map中获取一次
* 在Spring初始化阶段,这个get是没有意义的,但是当手动调用getBean()操作时,这个get很重要
*/
Object sharedInstance =getSingleton(beanName);/**
* 如果缓存中存在并且没有参数,则可以直接返回
*/if(sharedInstance != null && args == null){if(logger.isDebugEnabled()){if(isSingletonCurrentlyInCreation(beanName)){
logger.debug("Returning eagerly cached instance of singleton bean '"+ beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else{
logger.debug("Returning cached instance of singleton bean '"+ beanName +"'");}}/**
* 从一个Object中获取Bean实例(对于FactoryBean来说)
* 否则直接返回sharedInstance这个实例
*/
bean =getObjectForBeanInstance(sharedInstance, name, beanName, null);}else{// Fail if we're already creating this bean instance:// We're assumably within a circular reference./**
* 如果我们已经在创建此bean实例,则失败:
* 因为此时发生了不可修复的循环引用
*/if(isPrototypeCurrentlyInCreation(beanName)){thrownewBeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory./**
* 如果指定了父工厂,则利用父工厂进行Bean的创建
*/
BeanFactory parentBeanFactory =getParentBeanFactory();if(parentBeanFactory != null &&!containsBeanDefinition(beanName)){// Not found -> check parent.
String nameToLookup =originalBeanName(name);if(parentBeanFactory instanceofAbstractBeanFactory){return((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);}elseif(args != null){// Delegation to parent with explicit args.return(T) parentBeanFactory.getBean(nameToLookup, args);}else{// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}/**
* 存放到集合中,表示Bean即将创建
*/if(!typeCheckOnly){markBeanAsCreated(beanName);}try{/**
* 根据BeanName获取BeanDefinition并检查
*/final RootBeanDefinition mbd =getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on./**
* 获取@DependsOn注解内容,主要保证Bean所依赖的类已经被实例化
* 如果存在依赖类,则先实例化依赖类
*/
String[] dependsOn = mbd.getDependsOn();if(dependsOn != null){for(String dep : dependsOn){if(isDependent(beanName, dep)){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '"+ beanName +"' and '"+ dep +"'");}registerDependentBean(dep, beanName);try{getBean(dep);}catch(NoSuchBeanDefinitionException ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"'"+ beanName +"' depends on missing bean '"+ dep +"'", ex);}}}// Create bean instance./**
* 实例化单例Bean
*/if(mbd.isSingleton()){
sharedInstance =getSingleton(beanName,()->{try{/**
* 此对象是lambda表达式
* @see AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
*/returncreateBean(beanName, mbd, args);}catch(BeansException ex){// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});
bean =getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}/**
* 实例化原型Bean
*/elseif(mbd.isPrototype()){// It's a prototype -> create a new instance.
Object prototypeInstance = null;try{beforePrototypeCreation(beanName);
prototypeInstance =createBean(beanName, mbd, args);}finally{afterPrototypeCreation(beanName);}
bean =getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else{
String scopeName = mbd.getScope();final Scope scope =this.scopes.get(scopeName);if(scope == null){thrownewIllegalStateException("No Scope registered for scope name '"+ scopeName +"'");}try{
Object scopedInstance = scope.get(beanName,()->{beforePrototypeCreation(beanName);try{returncreateBean(beanName, mbd, args);}finally{afterPrototypeCreation(beanName);}});
bean =getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch(IllegalStateException ex){thrownewBeanCreationException(beanName,"Scope '"+ scopeName +"' is not active for the current thread; consider "+"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
ex);}}}catch(BeansException ex){cleanupAfterBeanCreationFailure(beanName);throw ex;}}// Check if required type matches the type of the actual bean instance.if(requiredType != null &&!requiredType.isInstance(bean)){try{
T convertedBean =getTypeConverter().convertIfNecessary(bean, requiredType);if(convertedBean == null){thrownewBeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch(TypeMismatchException ex){if(logger.isDebugEnabled()){
logger.debug("Failed to convert bean '"+ name +"' to required type '"+
ClassUtils.getQualifiedName(requiredType)+"'", ex);}thrownewBeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return(T) bean;}
/**
* 从一个Object中获取Bean实例
* 注意:从Object中获取Bean实例是对于实现了FactoryBean接口的Bean
*/protected Object getObjectForBeanInstance(
Object beanInstance, String name, String beanName,@Nullable RootBeanDefinition mbd){// Don't let calling code try to dereference the factory if the bean isn't a factory./**
* 判断BeanName是否以&开头,是的话则进入if代码块
* 如果Bean实现了NullBean接口,则直接返回Bean
* 如果Bean没有实现FactoryBean接口,则抛异常
*/if(BeanFactoryUtils.isFactoryDereference(name)){if(beanInstance instanceofNullBean){return beanInstance;}if(!(beanInstance instanceofFactoryBean)){thrownewBeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());}}// Now we have the bean instance, which may be a normal bean or a FactoryBean.// If it's a FactoryBean, we use it to create a bean instance, unless the// caller actually wants a reference to the factory./**
* 如果Bean没有实现FactoryBean接口或BeanName是以&开头,则直接返回Bean
*/if(!(beanInstance instanceofFactoryBean)|| BeanFactoryUtils.isFactoryDereference(name)){return beanInstance;}/**
* 定义返回的实例
* 到此证明获取的是FactoryBean中getObject方法返回的实例,而不是获取FactoryBean
*/
Object object = null;/**
* 首先从缓存中获取
*/if(mbd == null){
object =getCachedObjectForFactoryBean(beanName);}/**
* 返回对象没有在缓存中时,则将其强转为FactoryBean类型,判断对应的
*/if(object == null){// Return bean instance from factory./**
* 强转为FactoryBean类型
*/
FactoryBean<?> factory =(FactoryBean<?>) beanInstance;// Caches object obtained from FactoryBean if it is a singleton./**
* 判断此Bean对应的BeanDefinition是否是合成的
*/if(mbd == null &&containsBeanDefinition(beanName)){
mbd =getMergedLocalBeanDefinition(beanName);}boolean synthetic =(mbd != null && mbd.isSynthetic());/**
* 调用方法创建Bean实例
*/
object =getObjectFromFactoryBean(factory, beanName,!synthetic);}return object;}
getObjectFromFactoryBean
/**
* 从单例FactoryBean中或缓存中获取对象
*/protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName,boolean shouldPostProcess){/**
* FactoryBean是单例的并且已经实例化完成
*/if(factory.isSingleton()&&containsSingleton(beanName)){synchronized(getSingletonMutex()){/**
* 从缓存中获取
*/
Object object =this.factoryBeanObjectCache.get(beanName);/**
* 缓存中没有
*/if(object == null){/**
* 调用getObject()方法获取
*/
object =doGetObjectFromFactoryBean(factory, beanName);// Only post-process and store if not put there already during getObject() call above// (e.g. because of circular reference processing triggered by custom getBean calls)/**
* 上面调用getObject()方法可能会触发循环引用,这里进行一次获取
* 暂时不理解
*/
Object alreadyThere =this.factoryBeanObjectCache.get(beanName);if(alreadyThere != null){
object = alreadyThere;}else{/**
* 如果是合成的,则调用执行所有BeanPostProcessor的postProcessAfterInitialization回调处理
* @see AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean(java.lang.Object, java.lang.String)
*/if(shouldPostProcess){if(isSingletonCurrentlyInCreation(beanName)){// Temporarily return non-post-processed object, not storing it yet..return object;}beforeSingletonCreation(beanName);try{
object =postProcessObjectFromFactoryBean(object, beanName);}catch(Throwable ex){thrownewBeanCreationException(beanName,"Post-processing of FactoryBean's singleton object failed", ex);}finally{afterSingletonCreation(beanName);}}/**
* 实例的BeanName已经注册了,则将此Bean实例存放到缓存中
*/if(containsSingleton(beanName)){this.factoryBeanObjectCache.put(beanName, object);}}}return object;}}else{/**
* 到这里证明
* FactoryBean不是单例的或
* getObject()方法返回的实例的BeanName并没有注册进容器中(没有执行过getObject方法)
* 则调用getObject()方法进行实例的创建
*/
Object object =doGetObjectFromFactoryBean(factory, beanName);/**
* 如果是合成的,则调用执行所有BeanPostProcessor的postProcessAfterInitialization回调处理
* @see AbstractAutowireCapableBeanFactory#postProcessObjectFromFactoryBean(java.lang.Object, java.lang.String)
*/if(shouldPostProcess){try{
object =postProcessObjectFromFactoryBean(object, beanName);}catch(Throwable ex){thrownewBeanCreationException(beanName,"Post-processing of FactoryBean's object failed", ex);}}return object;}}
/**
* 返回BeanName对应的单例对象,如果没有注册则注册一个并返回
*/public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory){
Assert.notNull(beanName,"Bean name must not be null");synchronized(this.singletonObjects){/**
* 从单例对象Map集合中get
*/
Object singletonObject =this.singletonObjects.get(beanName);/**
* 集合中不存在则进行创建
*/if(singletonObject == null){/**
* 判断工厂是否正在销毁单例对象,即工厂处于关闭过程中,这时进行创建操作,报错
*/if(this.singletonsCurrentlyInDestruction){thrownewBeanCreationNotAllowedException(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 +"'");}/**
* 进行创建之前的必要操作
*/beforeSingletonCreation(beanName);/**
* 是否正确创建对象的标识,初始为false,当正确创建对象后置为true
*/boolean newSingleton =false;/**
* 抑制异常的集合,在对象创建过程中,会发生一些可处理的异常,会被存放进这个
* 集合中,会在catch代码块中进行提取并存放进异常对象中进行打印,
* 这些不是导致失败的直接原因,而是在创建bean实例之前发生的,例如引用链
* 如果这个集合不为null,则证明当前正在创建的对象是因为其它对象依赖本对象
* 而进行创建操作
*/boolean recordSuppressedExceptions =(this.suppressedExceptions == null);if(recordSuppressedExceptions){this.suppressedExceptions =newLinkedHashSet<>();}try{/**
* 执行创建对象
* 创建成功后将标识置为true
*/
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{/**
* 将抑制异常集合置为null
*/if(recordSuppressedExceptions){this.suppressedExceptions = null;}/**
* 执行创建对象后的必要操作
*/afterSingletonCreation(beanName);}/**
* 判断标识,将实例进行必要存储
*/if(newSingleton){addSingleton(beanName, singletonObject);}}return singletonObject;}}
AbstractAutowireCapableBeanFactory#createBean()
/**
* 创建bean实例、填充bean实例、应用后处理器等
*/@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd,@Nullable Object[] args)throws BeanCreationException {if(logger.isDebugEnabled()){
logger.debug("Creating instance of bean '"+ beanName +"'");}/**
* 进行BeanDefinition的引用赋值,见名知意理解为即将使用的BeanDefinition
*/
RootBeanDefinition mbdToUse = mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition./**
* 获取BeanDefinition中Class
*/
Class<?> resolvedClass =resolveBeanClass(mbd, beanName);/**
* 存在Class并且没有指定实例并且类名不为空则对BeanDefinition进行克隆
* 动态解析的类不能存储在共享合并bean定义中的情况下克隆bean定义。
*/if(resolvedClass != null &&!mbd.hasBeanClass()&& mbd.getBeanClassName()!= null){
mbdToUse =newRootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try{/**
* 做重写检查
*/
mbdToUse.prepareMethodOverrides();}catch(BeanDefinitionValidationException ex){thrownewBeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName,"Validation of method overrides failed", ex);}try{// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance./**
* 让BeanPostProcessors有机会返回代理而不是目标bean实例。
* 可以通过BeanPostProcessor实例化bd,不需要进行后面的流程
* 框架内部使用,一般不会用
*/
Object bean =resolveBeforeInstantiation(beanName, mbdToUse);if(bean != null){return bean;}}catch(Throwable ex){thrownewBeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try{/**
* 实际进行Bean的创建,也可能返回代理Bean
*/
Object beanInstance =doCreateBean(beanName, mbdToUse, args);if(logger.isDebugEnabled()){
logger.debug("Finished creating instance of bean '"+ beanName +"'");}return beanInstance;}catch(BeanCreationException| ImplicitlyAppearedSingletonException ex){// A previously detected exception with proper bean creation context already,// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.throw ex;}catch(Throwable ex){thrownewBeanCreationException(
mbdToUse.getResourceDescription(), beanName,"Unexpected exception during bean creation", ex);}}
doCreateBean
/**
* 实际创建指定的bean。此时已经进行了预创建处理,例如,
* 检查{@code postProcessBeforeInstantiation}回调。
* <p>区分默认bean实例化、工厂方法的使用和自动连接构造函数。
*/protected Object doCreateBean(final String beanName,final RootBeanDefinition mbd,final@Nullable Object[] args)throws BeanCreationException {// Instantiate the bean./**
* 这是一个Bean实例包装类
*/
BeanWrapper instanceWrapper = null;/**
* BeanDefinition代表单例时,先从缓存中通过删除方法返回实例,
*/if(mbd.isSingleton()){
instanceWrapper =this.factoryBeanInstanceCache.remove(beanName);}/**
* 返回为null则进行创建
*/if(instanceWrapper == null){
instanceWrapper =createBeanInstance(beanName, mbd, args);}/**
* 到此为止,Bean已经完成了实例创建
* 获取原始实例和原始Class
*/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./**
* 如果Spring中存在MergedBeanDefinitionPostProcessors类型的BeanPostProcessor时,执行
* 允许后处理器修改合并的bean定义。
*/synchronized(mbd.postProcessingLock){if(!mbd.postProcessed){try{applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch(Throwable ex){thrownewBeanCreationException(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./**
* 急切地缓存singleton,以便能够解析循环引用,
* 即使是由生命周期接口(如BeanFactoryAware)触发时也是如此。
* 提前缓存ObjectFactory以解决bean之间的循环依赖
* mbd.isSingleton()->是否单例
* allowCircularReferences->是否允许循环依赖
* isSingletonCurrentlyInCreation->该bean是否创建中
*/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");}addSingletonFactory(beanName,()->getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance./**
* 正式开始初始化Bean实例
*/
Object exposedObject = bean;try{/**
* 对Bean中的属性进行填充
*/populateBean(beanName, mbd, instanceWrapper);/**
* Bean的初始化
*/
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代码块
*/if(earlySingletonExposure){/**
* 获取BeanName对应的Bean实例,也就是从集合中获取的
*/
Object earlySingletonReference =getSingleton(beanName,false);if(earlySingletonReference != null){/**
* 集合中存在并且实例是相等的(没有发生重新创建操作)
* 则将返回的实例替换成刚提取的实例
*/if(exposedObject == bean){
exposedObject = earlySingletonReference;}/**
* 如果Bean发生了变化,且有其它Bean依赖了此Bean
*/elseif(!this.allowRawInjectionDespiteWrapping &&hasDependentBean(beanName)){/**
* 获取这些Bean的BeanName进行遍历
*/
String[] dependentBeans =getDependentBeans(beanName);
Set<String> actualDependentBeans =newLinkedHashSet<>(dependentBeans.length);for(String dependentBean : dependentBeans){/**
* 如果这些Bean已经实例化完成了,会返回false,添加到集合中下面会抛异常
* 如果没有实例化完成,则将其从集合中删除实例,以后再重新创建实例
*/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;}