spring 获取bean 过程, 其在AbstractBeanFactory
- 将bean 名称转换为实际的bean名称,实际逻辑为移除工厂bean名称前缀,如果是别名则找到实际名称
- 按照bean名称从单实例中获取,如果有且参数为空则使用单实例的bean否则开始创建。
- 创建流程,
3.1 判断当前线程是否已在创建,如果在创建说明是循环引用,所以抛出异常
3.2 如果本beanFactory 不存在beanDefinition,且存在上级beanFactory,从上级beanFactory 中获得,
3.3. 实例化前检查
3.3.1 获取此bean 的 beanDefiniton,且检查是否是虚拟的,如果是虚拟的则抛出异常,因为虚拟的不可实例化, 比如xml 中定义的 bean中
3.3.2 实例化前 检查依赖bean并获取 @DependsOn, xml 中的 depends-on
3.4 按照beandefition 中定义的bean类型实例化
3.4.1 如果是单实例模式,按照单实例创建,
3.4.2 如果是原型模式,重新创建
3.4.3 其他范围创建
3.5 检查要求的类型,并做转换。
此时获取到bean
protected <T> T doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
// 1.将bean 名称转换为实际的bean名称,实际逻辑为移除工厂bean名称前缀,如果是别名则找到实际名称
String beanName = transformedBeanName(name);
Object bean;
// Eagerly check singleton cache for manually registered singletons.
// 2 判断是否已单实例是否已实例化
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isTraceEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
}
}
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
// Fail if we're already creating this bean instance:
// We're assumably within a circular reference.
// 3.1判断当前线程是否已在创建,如果在创建说明是循环引用,所以抛出异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// Check if bean definition exists in this factory.
//3.2 如果本beanFactory 不存在beanDefinition,且存在上级beanFactory,从上级beanFactory 中获得,
BeanFactory parentBeanFactory = getParentBeanFactory();
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);
}
StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
.tag("beanName", name);
try {
if (requiredType != null) {
beanCreation.tag("beanType", requiredType::toString);
}
//3.3.1 获取此bean 的 beanDefiniton,且检查是否是虚拟的,如果是虚拟的则抛出异常,因为虚拟的不可实例化
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
// Guarantee initialization of