Spring版本:
<version>5.2.1.RELEASE</version>
目录
上一篇:17-Spring源码解析之Bean的生命周期(2)——【getSingleton】和【createBean】
上一篇我们讲到了getSingleton
方法调用createBean
方法来准备创建Bean
。通过上一篇文章,我们也了解到,createBean
方法首先调用resolveBeforeInstantiation
方法,resolveBeforeInstantiation
方法的返回值决定程序的后续执行步骤。即在执行resolveBeforeInstantiation
后,程序有以下两个选择:
- 如果创建了代理或者重写了
InstantiationAwareBeanPostProcessor
的postProcessBeforeInstantiation
方法并在方法postProcessBeforeInstantiation
中改变了Bean
,则直接返回。 - 如果没有改变
Bean
,就需要进行常规Bean
的创建。
而常规Bean
的创建就是createBean
调用doCreateBean
实现的。
一、doCreateBean
创建Bean
我们跟踪了这么多Spring
的代码,或多或少也发现了一个规律:一个真正干活的函数其实是以do
开头的,比如doCreateBean
,而给我们错觉的函数,比如getBean
,其实是从全局角度去做一些统筹工作。
废话不多说,直接上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) {
// 实例化Bean
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
//-------------------------------------------------【功能三】--1.1 详细讲解-----------------------------------------------
// 第二个BeanPostProcessor
// @Autowired 和 @Value注解就是再这里被解析的
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;
}
}
//-------------------------------------------------【功能四】--1.2 详细讲解-----------------------------------------------
// 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.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
//-------------------------------------------------【功能五】--依赖注入篇讲解-----------------------------------------------
// 属性填充
populateBean(beanName, mbd, instanceWrapper);
//-------------------------------------------------【功能六】--下一篇讲解-----------------------------------------------
// 调用初始化方法
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)