XmlBeanFactory初始化过程

143 阅读8分钟

XmlBeanFactory

XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是spring注册及加载bean的默认实现,而对于XmlBeanFactory和DefaultListableBeanFactory的区别是XmlBeanFactory中使用了自定义的xml加载器XmlBeanDefinitionReader,实现了个性化的BeanDefinition的读取,DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory并实现了ConfigurableListableBeanFactory以及BeanDefinitionRegistry接口。 XmlBeanFactory对DefaultListableBeanFactory进行了扩展,主要用于从xml中读取BeanDefinition,对于注册及获取bean都是使用继承自DefaultListableBeanFactory的方法实现,而唯独与父类不同的个性化实现就是增加了XMLBeanDefinitionReader类型的reader,在XmlBeanFactory中主要使用reader属性对资源文件进行读取和注册。

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("text.xml"));
TestBean testBean = (TestBean) beanFactory.getBean("testBean");

接下来分析以上代码执行过程

XmlBeanFactory初始化过程
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        ①
	super(parentBeanFactory);
        ②
	this.reader.loadBeanDefinitions(resource);
}

①处忽略给定接口的自动装配功能 ignoreDependencyInterface方法详见 www.jianshu.com/p/3c7e0608f…

public AbstractAutowireCapableBeanFactory() {
	super();
	ignoreDependencyInterface(BeanNameAware.class);
	ignoreDependencyInterface(BeanFactoryAware.class);
	ignoreDependencyInterface(BeanClassLoaderAware.class);
}

②处继续走,此处功能如下:
1.封装资源文件,首先对参数resource进行EncodedResource封装。
2.获取输入流,构造inputResource
3.执行doLoadBeanDefinitions()

public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
        //先对resource进行编码
	return loadBeanDefinitions(new EncodedResource(resource));
}

public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
	Assert.notNull(encodedResource, "EncodedResource must not be null");
	if (logger.isTraceEnabled()) {
		logger.trace("Loading XML bean definitions from " + encodedResource);
	}
	/**
	 * 通过ThreadLocal记录已加载的资源
	 */
	Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();

	if (!currentResources.add(encodedResource)) {
		throw new BeanDefinitionStoreException(
			"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
	}
	/**
	 * loadBeanDefinitions(new EncodedResource(resource));中指定了编码格式则使用
	 */
	try (InputStream inputStream = encodedResource.getResource().getInputStream()) {
		InputSource inputSource = new InputSource(inputStream);
		if (encodedResource.getEncoding() != null) {
			inputSource.setEncoding(encodedResource.getEncoding());
		}
		/**
		 * 解析xml
		 */
		return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
	} catch (IOException ex) {
			throw new BeanDefinitionStoreException(
					"IOException parsing XML document from " + encodedResource.getResource(), ex);
	} finally {
		/**
		 * 先执行finally将已加载的资源移除
		 */
		currentResources.remove(encodedResource);
		if (currentResources.isEmpty()) {
			this.resourcesCurrentlyBeingLoaded.remove();
		}
	}
}

doLoadBeanDefinitions方法如下:
1.doLoadDocument() 通过SAX解析xml转化为Document对象
2.registerBeanDefinitions()

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {
        
	Document doc = doLoadDocument(inputSource, resource);
	int count = registerBeanDefinitions(doc, resource);
	if (logger.isDebugEnabled()) {
            logger.debug("Loaded " + count + " bean definitions from " + resource);
        }
        return count;
}

registerBeanDefinitions()

public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
	//使用DefaultBeanDefinitionDocumentReader实例化BeanDefinitionDocumentReader
	BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
	//记录统计前beanDefinition的加载个数
	int countBefore = getRegistry().getBeanDefinitionCount();
        //加载及注册bean
	documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
	return getRegistry().getBeanDefinitionCount() - countBefore;
	}

doRegisterBeanDefinitions()首先对profile的处理,然后开始进行解析beanDefinition

protected void doRegisterBeanDefinitions(Element root) {
	BeanDefinitionParserDelegate parent = this.delegate;
	this.delegate = createDelegate(getReaderContext(), root, parent);

	if (this.delegate.isDefaultNamespace(root)) {
		//处理profile属性
		String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
		if (StringUtils.hasText(profileSpec)) {
			String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
						profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
				// We cannot use Profiles.of(...) since profile expressions are not supported
				// in XML config. See SPR-12458 for details.
				if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
					if (logger.isDebugEnabled()) {
						logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec +
								"] not matching: " + getReaderContext().getResource());
				}
				return;
			}
		}
	}
        //模板设计模式 留给子类实现
	preProcessXml(root);
	parseBeanDefinitions(root, this.delegate);
        //模板设计模式
	postProcessXml(root);

	this.delegate = parent;
}

parseBeanDefinitions()对xml配置进行解析,在spring中配置分为两大类

spring默认的,如:
<bean id="test" class="test.Test"/>
自定义的:
<tx:annotation-driven/>

两种配置方式的读取和解析是有很大差别的,通过判断命名空间判断是否为www.springframework.org/schema/bean… 进行比对,如果一直则为默认,否则就认为是自定义

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
	if (delegate.isDefaultNamespace(root)) {
		NodeList nl = root.getChildNodes();
		for (int i = 0; i < nl.getLength(); i++) {
			Node node = nl.item(i);
			if (node instanceof Element) {
				Element ele = (Element) node;
				if (delegate.isDefaultNamespace(ele)) {
                                        //默认配置走这里
					parseDefaultElement(ele, delegate);
				} else {
                                        //自定义走这里
					delegate.parseCustomElement(ele);
				}
			}
		}
	} else {
		delegate.parseCustomElement(root);
	}
}

默认标签的解析 parseDefaultElement()

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
	if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
		importBeanDefinitionResource(ele);
	} else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
		processAliasRegistration(ele);
	} else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
		processBeanDefinition(ele, delegate);
	} else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
		// recurse
		doRegisterBeanDefinitions(ele);
	}
}

processBeanDefinition()对bean标签的解析:

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
	/**
	 * 先委托BeanDefinitionParserDelegate的parseBeanDefinitionElement进行元素解析,返回
	 * BeanDefinitionHolder类型的bdHolder经过这个方法后,bdHolder实例已经包含我们配置文件中配置的各种属性了
	 * 例如class、name、id 、alias之类的属性。
	 */
	BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
	if (bdHolder != null) {
		//解析自定义属性
		bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
		try {
		        // 委托BeanDefinitionReaderUtils.registerBeanDefinition对bdHolder进行注册
			BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
		} catch (BeanDefinitionStoreException ex) {
			getReaderContext().error("Failed to register bean definition with name '" +
					bdHolder.getBeanName() + "'", ele, ex);
		}
		// 发出响应事件,通知相关监听器,bean加载完成
		getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
	}
}

parseBeanDefinitionElement()
1.解析id、name属性
2.parseBeanDefinitionElement()进一步解析其他属性并统一封装至GenericBeanDefinition类型的实例中
3.如果检测bean没有指定beanName则按照默认规则生成beanName
4.将获取到的信息封装到BeanDefinitionHodler的实例中

public AbstractBeanDefinition parseBeanDefinitionElement(
			Element ele, String beanName, @Nullable BeanDefinition containingBean) {
	//表明正在解析
	this.parseState.push(new BeanEntry(beanName));
	String className = null;
	if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
		className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
	}
	String parent = null;
	if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
		parent = ele.getAttribute(PARENT_ATTRIBUTE);
	}
	try {
		//创建用于承载属性的AbstractBeanDefinition类型的GenericBeanDefinition实例
		AbstractBeanDefinition bd = createBeanDefinition(className, parent);
		//解析bean的各种属性 如scope、lazy-init.....
		parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
		//提取description
		bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
		//解析元数据
		parseMetaElements(ele, bd);
		//解析look-up属性
		parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
		//解析replace-method属性
		parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
		//解析构造函数参数
		parseConstructorArgElements(ele, bd);
		//解析property参数
		parsePropertyElements(ele, bd);
		//解析qualifier参数
		parseQualifierElements(ele, bd);
		bd.setResource(this.readerContext.getResource());
		bd.setSource(extractSource(ele));
		return bd;
	} finally {
		this.parseState.pop();
	}
	return null;
}

registerBeanDefinition()
通过beanName注册:
1.对AbstractBeanDefinition针对methodOrrverrides属性进行校验
2.对beanName已经注册的情况处理,如果设置了不允许bean覆盖则抛异常
3.加入beanDefinitionMap缓存
4.清除解析之前留下的对应beanNam巳的缓存

通过别名注册:
1.别名与beanName相同的情况处理,若别名与beanName相同则remove别名
2.alias覆盖处理,若aliasName已经使用并指向了另一beanName则需要用户设置进行处理
3.alias循环检查,当A->B存在时,若再次出现A->C->B则会抛异常
4.注册alias

自定义标签解析:
使用自定义标签的步骤(参见spring-tx):
1.创建一个用来接收配置文件的model
2.定义一个XSD文件描述组件内容
3.创建一个implements自BeanDefinitionParser的parse类,用来解析XSD文件
4.创建一个extends自NamespaceHandlerSupport的handler类,将组件注册到spring容器
5.编写Spring.handlers和Spring.schemas文件,默认位置在/META-INF/文件夹下,当然你可以通过spring的扩展或者修改源码的方式更改位置

parseCustomElement()方法

public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
        //获取对应的命名空间
	String namespaceUri = getNamespaceURI(ele);
	if (namespaceUri == null) {
		return null;
	}
        //根据对应的命名空间找到对应的NameSpaceHandler,并执行对应的handler的init方法,将handler注册
	NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
	if (handler == null) {
		error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
		return null;
	}
        //进行解析
	return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
}

parse():

public BeanDefinition parse(Element element, ParserContext parserContext) {
        //找到对应的解析器 即在resolver方法中调用的对应的init方法注册的parser
	BeanDefinitionParser parser = findParserForElement(element, parserContext);
        //执行对应的解析流程
	return (parser != null ? parser.parse(element, parserContext) : null);
}
getBean()

调用AbstractBeanFactory中的doGetBean方法

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
							  @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
        //获取beanName
	final String beanName = transformedBeanName(name);
	Object bean;
        /**
        * 尝试从缓存中获取或者singletonFactories中的ObjectFactory中获取
        * 解决循环依赖,后面详细说明
        */
	Object sharedInstance = getSingleton(beanName);
	if (sharedInstance != null && args == null) {
                //返回指定方法返回的实例,不一定是直接返回实例本身
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
	} else {
                //只有在单例情况下才会尝试解决循环依赖,如果是prototype下直接抛异常
		if (isPrototypeCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
		BeanFactory parentBeanFactory = getParentBeanFactory();
                //如果是beanDefinitionMap中也就是已加载的类中不存在beanName则尝试从父工厂中加载
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			// Not found -> check parent.
			String nameToLookup = originalBeanName(name);
			if (parentBeanFactory instanceof AbstractBeanFactory) {
				return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
                                nameToLookup, requiredType, args, typeCheckOnly);
			} else if (args != null) {
				// Delegation to parent with explicit args.
				return (T) parentBeanFactory.getBean(nameToLookup, args);
			} else if (requiredType != null) {
				// No args -> delegate to standard getBean method.
				return parentBeanFactory.getBean(nameToLookup, requiredType);
			} else {
				return (T) parentBeanFactory.getBean(nameToLookup);
			}
		}
		if (!typeCheckOnly) {
			markBeanAsCreated(beanName);
		}
		try {
                        //将GenericBeanDefinition转换为RootBeanDefinition
                        //如果指定beanName是子bean的话会合并父类的相关属性
			final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
			checkMergedBeanDefinition(mbd, beanName, args);
			// Guarantee initialization of beans that the current bean depends on.
			String[] dependsOn = mbd.getDependsOn();
                        //若存在依赖则需要递归实例化依赖的bean
			if (dependsOn != null) {
				for (String dep : dependsOn) {
					if (isDependent(beanName, dep)) {
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
					}
                                        //缓存依赖调用
					registerDependentBean(dep, beanName);
					try {
					getBean(dep);
					} catch (NoSuchBeanDefinitionException ex) {
						throw new BeanCreationException(mbd.getResourceDescription(), beanName,
								"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
					}
				}
			}
			// 实例化依赖的bean之后实例化mbd本身
			if (mbd.isSingleton()) {
				sharedInstance = getSingleton(beanName, () -> {
					try {
						return createBean(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);
			} else if (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();
				if (!StringUtils.hasLength(scopeName)) {
					throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
				}
				final Scope scope = this.scopes.get(scopeName);
				if (scope == null) {
					throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
				}
				try {
					Object scopedInstance = scope.get(beanName, () -> {
						beforePrototypeCreation(beanName);
						try {
							return createBean(beanName, mbd, args);
						} finally {
							afterPrototypeCreation(beanName);
						}
					});
					bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
				} catch (IllegalStateException ex) {
					throw new ScopeNotActiveException(beanName, scopeName, 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) {
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
			return convertedBean;
		} catch (TypeMismatchException ex) {
			if (logger.isTraceEnabled()) {
				logger.trace("Failed to convert bean '" + name + "' to required type '" +
						ClassUtils.getQualifiedName(requiredType) + "'", ex);
			}
			throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
		}
	}
	return (T) bean;
}

getSingleton(beanName)

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
	//尝试从缓存获取实例(当前bean是否已加载过)
	Object singletonObject = this.singletonObjects.get(beanName);
	//一级缓存中不存在并且正在创建中
	if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
		synchronized (this.singletonObjects) {
			//从三级缓存中获取
			singletonObject = this.earlySingletonObjects.get(beanName);
			//如果获取不到且该bean允许提前依赖
			if (singletonObject == null && allowEarlyReference) {
				//从二级缓存中获取该bean对应的ObjectFactory
				ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
				if (singletonFactory != null) {
					//通过该bean对应的ObjectFactory.getObject()获取bean实例
					singletonObject = singletonFactory.getObject();
					//放入三级缓存中
					this.earlySingletonObjects.put(beanName, singletonObject);
					//从二级缓存中移除
					this.singletonFactories.remove(beanName);
				}
			}
		}
	}
	return singletonObject;
}

如果getSingleton返回的实例不为空,则通过getObjectForBeanInstance()方法处理。在getBean方法中,getObjectForBeanInstance()是个高频使用的方法,无论是从缓存中获得bean还是根据不同的scope策略加载bean,在得到bean的第一步就是检测这个bean是否是FactoryBean类型的bean,如果是则调用对应的FactoryBean中的getObject()返回实例。

createBean()

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
	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.
	Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
	if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
		mbdToUse = new RootBeanDefinition(mbd);
		mbdToUse.setBeanClass(resolvedClass);
	}
	// Prepare method overrides.
	try {
		//替换look-up、replace-method方法
		mbdToUse.prepareMethodOverrides();
	} catch (BeanDefinitionValidationException ex) { }
	try {
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		//给BeanPostProcessors一个机会来返回代理替代真正的实例 
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		if (bean != null) {
			return bean;
		}
	} catch (Throwable ex) {}
	try {
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isTraceEnabled()) {
			logger.trace("Finished creating instance of bean '" + beanName + "'");
		}
		return beanInstance;
	} catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
		throw ex;
	}
}

在createBean方法中有两个重要点:
1.mbdToUse.prepareMethodOverrides();在spring中如果配置了look-up、replace-method,在这里进行方法覆盖。 2.resolveBeforeInstantiation(),实例化的前置处理,在真正调用doCreate方法之前给使用者进行拓展的机会,aop基于此处判断。

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
	Object bean = null;
	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
		// Make sure bean class is actually resolved at this point.
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			Class<?> targetType = determineTargetType(beanName, mbd);
			if (targetType != null) {
                        //实例化前的前置处理
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				if (bean != null) {
                                //实例化前的后置处理
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}

doCreateBean():

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) {
		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.
	//MergedBeanDefinitionPostProcessors进行扩展
	synchronized (mbd.postProcessingLock) {
		if (!mbd.postProcessed) {
			try {
				applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			} catch (Throwable ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Post-processing of merged bean definition failed", ex);
			}
			mbd.postProcessed = true;
		}
	}
	// 单例&&循序循环依赖&&正在创建
	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");
		}
		//为避免后续循环依赖 提前将创建实例的ObjectFactory暴露出来,放入三级缓存
		addSingletonFactory(beanName, () ->
				//给SmartInstantiationAwareBeanPostProcessor发挥机会,aop在这里将advice动态织入bean中
				getEarlyBeanReference(beanName, mbd, bean));
	}

	// Initialize the bean instance.
	Object exposedObject = bean;
	try {
		//对bean进行属性填充,注入 若有其他依赖则递归初始化依赖bean
		populateBean(beanName, mbd, instanceWrapper);
		//调用初始化方法  init-method、afterProperties等
		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);
		//earlySingletonReference只有在检测到有循环依赖的情况下才不为空
		if (earlySingletonReference != null) {
			//exposedObject若没有在初始化方法中被增强
			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 " +
									"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
				}
			}
		}
	}

	// Register bean as disposable.
	try {
		registerDisposableBeanIfNecessary(beanName, bean, mbd);
	} catch (BeanDefinitionValidationException ex) {
		throw new BeanCreationException(
				mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
	}

	return exposedObject;
}

initializeBean():

protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
	if (System.getSecurityManager() != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			invokeAwareMethods(beanName, bean);
			return null;
		}, getAccessControlContext());
	} else {
		//激活各种Aware接口
		invokeAwareMethods(beanName, bean);
	}
	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
		//使用beanPostProcessor进行扩展
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}
	try {
		//执行自定义初始化方法 afterPropertiesSet或者init-method
		invokeInitMethods(beanName, wrappedBean, mbd);
	} catch (Throwable ex) {
		throw new BeanCreationException(
				(mbd != null ? mbd.getResourceDescription() : null),
				beanName, "Invocation of init method failed", ex);
	}
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
	return wrappedBean;
}