我精心收集了一份10万字的java全面知识总结,包括了java几乎所有的面试基础解读,有兴趣可以获取看看
领取方式
https://pan.quark.cn/s/4e6e3d03407a
一、概览
Spring Bean 生命周期从实例化开始,到销毁结束,涵盖了多个步骤:实例化、属性赋值、初始化、销毁。
从源码角度看,Bean 的加载过程由多个组件协同完成,重点集中在 refresh()
方法内部。
整个流程遵循 IOC 容器的初始化规则,通过 BeanFactory
和 ApplicationContext
协作完成。
二、生命周期整体流程
Bean 的生命周期主要包括以下阶段:
- 实例化:通过构造方法创建对象;
- 属性赋值:注入依赖;
- 初始化:执行初始化方法;
- 使用中:提供服务;
- 销毁:容器关闭时执行清理操作。
下面从容器启动和 Bean 加载两个角度看源码过程。
三、容器启动过程
Spring 容器的入口在 AbstractApplicationContext#refresh()
方法。主要步骤如下:
1. prepareRefresh()
做基础准备工作,设置启动时间、配置校验、初始化环境等。
2. obtainFreshBeanFactory()
加载或刷新 BeanFactory。通常调用的是 AbstractRefreshableApplicationContext#refreshBeanFactory()
。
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
3. prepareBeanFactory(beanFactory)
设置一些标准配置,比如:
- 设置类加载器;
- 注册默认的 BeanPostProcessor;
- 设置表达式解析器;
- 设置自动装配规则等。
四、Bean 的加载与注册
1. invokeBeanFactoryPostProcessors(beanFactory)
处理 BeanDefinitionRegistryPostProcessor
和 BeanFactoryPostProcessor
。
这些后处理器能动态修改 Bean 定义,参与容器启动前的准备。
2. registerBeanPostProcessors(beanFactory)
注册所有实现了 BeanPostProcessor
接口的类。这些类会在 Bean 实例化前后做处理。
这一步是生命周期的关键节点之一,很多框架扩展点都靠它完成,比如 AOP、注解支持等。
五、Bean 的创建流程
真正加载 Bean 的入口方法是:
getBean("xxx")
内部调用的是 AbstractBeanFactory#doGetBean()
方法。主要流程如下:
1. 缓存查找
先查一级缓存,是否已有 Bean 实例。
Object sharedInstance = getSingleton(beanName);
如果有,直接返回。
2. 没有就创建
走 createBean()
方法。最终调用到:
AbstractAutowireCapableBeanFactory#createBean()
六、createBean 详解
这是 Bean 创建的核心方法。主要包括几步:
1. 实例化 Bean
Object beanInstance = resolveBeforeInstantiation(beanName, mbdToUse);
尝试使用 InstantiationAwareBeanPostProcessor
创建实例。如果返回不为 null,说明代理对象已经创建,流程结束。
否则继续调用:
doCreateBean(beanName, mbdToUse, args);
七、doCreateBean 核心流程
这个方法细分为几个步骤:
1. 实例化对象
Object bean = createBeanInstance(beanName, mbd, args);
根据构造方法、工厂方法等策略创建对象。
2. 处理循环依赖(提前暴露)
如果支持循环依赖,会提前把这个 Bean 放入三级缓存:
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
3. 属性填充
populateBean(beanName, mbd, instanceWrapper);
处理依赖注入,执行 @Autowired
、@Value
等注解绑定,也包括手动 setXxx()
。
依赖注入通过 InstantiationAwareBeanPostProcessor
进行扩展,比如 AutowiredAnnotationBeanPostProcessor
。
八、初始化过程
1. 调用 Aware 接口
如果 Bean 实现了以下接口,容器会注入相关对象:
- BeanNameAware
- BeanClassLoaderAware
- BeanFactoryAware
- ApplicationContextAware
这些注入过程在 invokeAwareMethods()
中完成。
2. 执行 BeanPostProcessor 的 postProcessBeforeInitialization
applyBeanPostProcessorsBeforeInitialization(bean, beanName);
所有已注册的 BeanPostProcessor
会被调用。
3. 执行初始化方法
如果实现了 InitializingBean
,会执行 afterPropertiesSet()
方法;
如果指定了 init-method
,也会调用。
4. 执行 BeanPostProcessor 的 postProcessAfterInitialization
applyBeanPostProcessorsAfterInitialization(bean, beanName);
在这里完成代理增强,AOP、事务、异步等都是在这一步实现。
九、使用中阶段
Bean 初始化完成后,就进入使用阶段。
这个阶段的 Bean 可以被外部获取,也可以被其他 Bean 依赖调用。
十、销毁过程
当容器关闭时,调用 AbstractApplicationContext#close()
方法,触发销毁流程。
destroyBeans();
销毁流程包括:
- 执行
DisposableBean
的destroy()
方法; - 调用
@PreDestroy
注解方法; - 调用
destroy-method
配置的方法。
十一、Bean 生命周期总结流程图(简述)
构造器(实例化)
↓
依赖注入
↓
Aware 接口注入
↓
前置处理器(postProcessBeforeInitialization)
↓
初始化方法(afterPropertiesSet/init-method)
↓
后置处理器(postProcessAfterInitialization)
↓
使用中
↓
容器关闭
↓
销毁(destroy-method)
十二、常见扩展点
- 自定义 BeanPostProcessor:处理初始化前后逻辑;
- 实现 BeanFactoryPostProcessor:动态修改 BeanDefinition;
- 使用注解
@PostConstruct
、@PreDestroy
; - 实现 Aware 接口感知容器状态;
- 使用
@DependsOn
控制 Bean 加载顺序。
十三、使用建议
- 初始化逻辑尽量放在
afterPropertiesSet
或@PostConstruct
中; - 销毁逻辑用
@PreDestroy
或destroy-method
; - 避免在构造器中做依赖逻辑处理;
- 了解 BeanPostProcessor 对 AOP 等功能的影响;
- 熟悉源码路径:
AbstractBeanFactory
→createBean
→doCreateBean
。
十四、总结
Spring 容器通过一整套标准流程来管理 Bean,从创建、初始化到销毁,都有明确的生命周期节点。
了解这些流程,能更好地掌握 Bean 的行为,也能更准确地定位问题。
Spring 通过扩展接口、注解、处理器等方式提供了完整的定制能力。
掌握这些接口和流程,在开发中可以灵活应对各种需求,写出更健壮、更可控的代码。