Spring 获取 Bean 完整流程源码解析:从 getBean 到 Bean 就绪
Spring 容器获取 Bean 的核心入口是 getBean() 方法,但其底层逻辑完全封装在 doGetBean() 中 —— 这是 Spring IOC 容器实现 “Bean 查找、创建、依赖注入、初始化” 的核心方法。从 “入口触发→Bean 名称处理→缓存查找(三级缓存)→循环依赖处理→不同作用域 Bean 创建→属性注入与初始化” 六个维度,逐行拆解获取 Bean 的全流程。
核心入口:getBean() 与 doGetBean()
getBean() 是用户调用的入口方法,但其仅做简单转发,真正的逻辑全部在 doGetBean() 中实现。这一设计遵循 “职责单一” 原则 ——getBean() 暴露接口,doGetBean() 封装复杂逻辑。
1. 入口方法调用链
1 2 3 4 5 6 7 8 9
| ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); Car car = (Car) context.getBean("car");
public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }
|
2. doGetBean():获取 Bean 的 “总控制器”
doGetBean() 是整个流程的核心,代码虽长,但逻辑清晰,可拆解为 8 个关键步骤,每个步骤对应特定职责:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| protected <T> T doGetBean( final String name, // 用户传入的 Bean 名称(可能是别名/FactoryBean) final Class<T> requiredType, // 期望的 Bean 类型(用于类型转换) final Object[] args, // 构造方法参数(创建 Bean 时用) boolean typeCheckOnly // 是否仅做类型检查(不创建 Bean) ) throws BeansException {
final String beanName = transformedBeanName(name); Object bean;
Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); }
else { if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); }
BeanFactory parentBeanFactory = getParentBeanFactory(); if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { String nameToLookup = originalBeanName(name); return (T) parentBeanFactory.getBean(nameToLookup, args); }
if (!typeCheckOnly) { markBeanAsCreated(beanName); }
try { final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); checkMergedBeanDefinition(mbd, beanName, args);
String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { if (isDependent(beanName, dep)) { throw new BeanCreationException("循环依赖:" + beanName + " ↔ " + dep); } registerDependentBean(dep, beanName); getBean(dep); } }
if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { destroySingleton(beanName); throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); }
else if (mbd.isPrototype()) { 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) { throw new IllegalStateException("未注册作用域:" + scopeName); } try { Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException("作用域 " + scopeName + " 未激活"); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } }
if (requiredType != null && bean != null && !requiredType.isInstance(bean)) { try { return getTypeConverter().convertIfNecessary(bean, requiredType); } catch (TypeMismatchException ex) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } }
return (T) bean; }
|
关键步骤深度拆解
用户传入的 name 可能是别名、FactoryBean 名称(带 & 前缀),需转换为 “真实 beanName”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| protected String transformedBeanName(String name) { String beanName = BeanFactoryUtils.transformedBeanName(name); if (this.aliasMap.containsKey(beanName)) { String canonicalName; do { canonicalName = this.aliasMap.get(beanName); beanName = canonicalName; } while (this.aliasMap.containsKey(beanName)); } return beanName; }
|
- FactoryBean 前缀 &:
&userFactory 表示获取 UserFactory 本身,而非其 getObject() 生成的 User 对象;
- 别名解析:Spring 允许通过
<alias name="car" alias="carAlias"/> 配置别名,此处需递归解析到原始 beanName。
步骤 2:getSingleton()—— 三级缓存与循环依赖解决
Spring 用三级缓存存储单例 Bean 的不同状态,核心目标是解决单例 Bean 的循环依赖(如 A 依赖 B,B 依赖 A),原型 Bean 因无缓存无法解决循环依赖。
(1)三级缓存定义
1 2 3 4
| private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16); private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
|
(2)getSingleton() 缓存查找逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| protected Object getSingleton(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) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return (singletonObject != NULL_OBJECT ? singletonObject : null); }
|
(3)三级缓存解决循环依赖示例(A 依赖 B,B 依赖 A)
- 创建 A:调用
doCreateBean(A),实例化 A 后,将 ObjectFactory(A) 放入三级缓存;
- A 注入 B:A 需注入 B,调用
getBean(B);
- 创建 B:调用
doCreateBean(B),实例化 B 后,将 ObjectFactory(B) 放入三级缓存;
- B 注入 A:B 需注入 A,调用
getBean(A);
- 查找 A:从三级缓存获取
ObjectFactory(A),生成早期 A(未注入属性),放入二级缓存;
- B 初始化完成:B 注入早期 A 后,完成初始化,放入一级缓存;
- A 注入 B:A 从一级缓存获取完整 B,完成属性注入,放入一级缓存。
核心结论:三级缓存通过 “提前暴露未完成初始化的 Bean”,打破了单例 Bean 的循环依赖死锁。
步骤 3:getObjectForBeanInstance()—— 处理 FactoryBean
Spring 中 Bean 分为普通 Bean 和 FactoryBean:
- 普通 Bean:直接返回实例;
- FactoryBean:返回其
getObject() 生成的目标对象(需特殊处理)。
源码逻辑拆解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| protected Object getObjectForBeanInstance( Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) { throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass()); }
if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) { return beanInstance; }
Object object = null; if (mbd == null) { object = getCachedObjectForFactoryBean(beanName); }
if (object == null) { FactoryBean<?> factory = (FactoryBean<?>) beanInstance; if (mbd == null && containsBeanDefinition(beanName)) { mbd = getMergedLocalBeanDefinition(beanName); } boolean synthetic = (mbd != null && mbd.isSynthetic()); object = getObjectFromFactoryBean(factory, beanName, !synthetic); }
return object; }
|
关键细节
- FactoryBean 缓存:单例 FactoryBean 生成的目标对象会存入
factoryBeanObjectCache,避免重复调用 getObject();
- & 前缀作用:
getBean("&userFactory") 返回 UserFactory 本身,getBean("userFactory") 返回 userFactory.getObject() 生成的 User 对象。
步骤 4:createBean()→doCreateBean()——Bean 实例化与初始化
当缓存无 Bean 且需新建时,createBean() 是入口,实际逻辑在 doCreateBean() 中,包含 “实例化→属性注入→初始化” 三大核心环节。
(1)doCreateBean() 核心流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { 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(); mbd.resolvedTargetType = beanType;
synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); mbd.postProcessed = true; } }
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); if (earlySingletonExposure) { addSingletonFactory(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { return getEarlyBeanReference(beanName, mbd, bean); } }); }
Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { exposedObject = initializeBean(beanName, exposedObject, mbd); } } catch (Throwable ex) { throw new BeanCreationException("Bean 初始化失败", ex); }
try { registerDisposableBeanIfNecessary(beanName, bean, mbd); } catch (BeanDefinitionValidationException ex) { throw new BeanCreationException("销毁方法配置错误", ex); }
return exposedObject; }
|
(2)关键子环节详解
① createBeanInstance():实例化 Bean
通过以下方式创建空对象(未注入属性):
- 构造器实例化:默认无参构造器,或根据
constructor-arg 匹配有参构造器;
- 工厂方法实例化:静态工厂(
factory-method)或实例工厂(factory-bean + factory-method)。
② populateBean():属性注入
核心是 “将依赖的 Bean 或简单值注入到当前 Bean 的属性中”,支持三种注入方式:
- XML 显式配置:
<property name="userDao" ref="userDao"/>;
- 自动注入:
autowire="byName"(按属性名匹配 Bean)或 autowire="byType"(按属性类型匹配 Bean);
- 注解注入:
@Autowired(由 AutowiredAnnotationBeanPostProcessor 处理)、@Value(解析 SpEL 表达式)。
源码关键逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { return; } } } }
int resolvedAutowireMode = mbd.getResolvedAutowireMode(); if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(mbd.getPropertyValues()); if (resolvedAutowireMode == AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } mbd.setPropertyValues(newPvs); }
applyPropertyValues(beanName, mbd, bw, mbd.getPropertyValues()); }
|
③ initializeBean():初始化 Bean
Bean 实例化并注入属性后,执行初始化逻辑,按以下顺序执行:
- Aware 接口回调:注入容器服务(如
BeanNameAware、ApplicationContextAware);
- BeanPostProcessor 前置处理:
postProcessBeforeInitialization()(如 @PostConstruct 注解执行);
- 初始化方法:
InitializingBean.afterPropertiesSet() → XML/@Bean 配置的 init-method;
- BeanPostProcessor 后置处理:
postProcessAfterInitialization()(AOP 代理生成在此处)。
源码逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| protected Object initializeBean(String beanName, Object bean, RootBeanDefinition mbd) { invokeAwareMethods(beanName, bean);
Object wrappedBean = bean; if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); }
try { invokeInitMethods(beanName, wrappedBean, mbd); } catch (Throwable ex) { throw new BeanCreationException("初始化方法执行失败", ex); }
if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); }
return wrappedBean; }
|
不同作用域 Bean 的创建差异
Spring 支持多种 Bean 作用域,核心差异在于 “实例数量” 和 “生命周期管理”,doGetBean() 中针对不同作用域有不同处理逻辑:
| 作用域 |
实例数量 |
生命周期管理 |
创建逻辑关键点 |
| singleton(单例) |
容器内唯一 |
容器启动时创建(非懒加载),容器关闭时销毁 |
存入 singletonObjects 缓存,仅创建一次 |
| prototype(原型) |
每次 getBean() 新实例 |
实例化后容器不再管理(需手动销毁) |
不缓存,每次调用 createBean() 生成新实例 |
| request |
每个 HTTP 请求新实例 |
请求结束时销毁 |
委托 RequestScope 绑定到当前请求 |
| session |
每个 HTTP Session 新实例 |
Session 过期时销毁 |
委托 SessionScope 绑定到当前 Session |
总结:获取 Bean 的完整链路
Spring 获取 Bean 的流程本质是 “先查缓存→再处理依赖→最后创建实例”,可精简为 10 步:
- 调用
getBean(name),转发到 doGetBean();
transformedBeanName():解析别名和 FactoryBean 前缀,得到真实 beanName;
getSingleton(beanName):从三级缓存查找单例 Bean,存在则返回;
- 检查原型循环依赖,存在则报错;
- 若父容器存在且当前容器无该 BeanDefinition,委托父容器查找;
- 处理
dependsOn:递归 getBean() 初始化被依赖的 Bean;
- 根据作用域创建 Bean:
- 单例:调用
getSingleton() 传入 ObjectFactory,内部调用 createBean();
- 原型:直接调用
createBean() 生成新实例;
- doCreateBean():
createBeanInstance():实例化 Bean(空对象);
applyMergedBeanDefinitionPostProcessors():解析 @Autowired 等注解;
- 提前暴露 Bean 到三级缓存(解决循环依赖);
populateBean():属性注入;
initializeBean():执行 Aware 回调、BeanPostProcessor、init-method;
getObjectForBeanInstance():若为 FactoryBean,返回其 getObject() 生成的目标对象;
- 类型转换:将 Bean 转换为用户期望的类型,返回给用户