spring bean生命周期是“从定义到销毁”的全过程,加载流程则聚焦容器启动后将类转为可用bean实例的三步:解析配置为beandefinition、注册到beandefinitionmap、实例化并填充依赖;核心由refresh()驱动,经dogetbean调用getsingleton或createbean完成创建,各阶段对应instantiationawarebeanpostprocessor、beanpostprocessor等扩展点。

Spring Bean 的生命周期,本质是“从定义到销毁”的全过程;而加载流程,则聚焦在容器启动后如何把一个类变成可用的 Bean 实例。两者紧密交织,但侧重点不同:生命周期强调时间维度上的阶段变化,加载流程强调动作链条上的执行顺序。
Bean 加载三步走:解析 → 注册 → 实例化
无论用 XML、@Component 还是 @Configuration,Spring 最终都统一归为三步:
-
解析配置:把
<bean></bean>标签、@Component注解、JavaConfig 中的@Bean方法等,转换成内存中的BeanDefinition对象(含 class 类型、作用域、是否懒加载等元数据); -
注册元数据:将
BeanDefinition存入BeanDefinitionRegistry(通常是DefaultListableBeanFactory内部的beanDefinitionMap); -
实例化与填充:调用
getBean()或容器刷新时触发finishBeanFactoryInitialization(),真正创建对象、注入依赖、执行初始化回调、放入单例池。
refresh() 是整个加载流程的总开关
Spring 容器(如 AnnotationConfigApplicationContext)启动时,核心就是调用 refresh() 方法。它像一条流水线,按序完成关键动作:
-
prepareRefresh():校验环境、初始化占位符(如${xxx}); -
obtainFreshBeanFactory():创建干净的BeanFactory; -
prepareBeanFactory():注入Environment、ClassLoader等基础组件,并注册内置后置处理器; -
invokeBeanFactoryPostProcessors():执行BeanFactoryPostProcessor(如ConfigurationClassPostProcessor),扫描并注册所有用户定义的BeanDefinition; -
registerBeanPostProcessors():注册BeanPostProcessor(如AutowiredAnnotationBeanPostProcessor),为后续初始化增强做准备; -
finishBeanFactoryInitialization():对所有非懒加载的单例 Bean 执行getBean(),触发完整创建流程; -
finishRefresh():发布容器就绪事件,标志加载完成。
Bean 创建的核心链路:doGetBean → getSingleton → createBean
当真正要获取一个 Bean(比如调用 context.getBean("userService")),实际走的是 doGetBean() 方法,其主干逻辑如下:
- 先查三级缓存(
singletonObjects→earlySingletonObjects→singletonFactories),尝试获取已创建或正在创建的单例; - 若未命中,进入
createBean():推断构造器 → 反射实例化(instantiateBean())→ 包装为BeanWrapper; - 接着属性填充(
populateBean()):完成 @Autowired、@Value 等依赖注入; - 再执行初始化(
initializeBean()):调用afterPropertiesSet()、@PostConstruct、以及所有BeanPostProcessor.postProcessBeforeInitialization()和postProcessAfterInitialization(); - 最后检查是否为单例,放入一级缓存,供后续复用。
生命周期关键节点与扩展点对应关系
Bean 从 new 出来到可使用,每个环节都有对应的扩展接口,方便定制行为:
- 实例化前:
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(); - 属性注入前:
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(); - 属性注入后、初始化前:
BeanPostProcessor.postProcessBeforeInitialization(); - 初始化后(如
@PostConstruct执行完):BeanPostProcessor.postProcessAfterInitialization(); - 销毁前:
DisposableBean.destroy()或@PreDestroy方法。
基本上就这些。理解这四层——加载三步、refresh 主线、doGetBean 链路、生命周期钩子——就能稳稳把握 Spring Bean 的来龙去脉。










