文章目录
- 1. **生产(Production)**
- (1)定义 Bean(Bean Definition)
- (2)创建 Bean(Bean Instantiation & Initialization)
- (3)添加 Bean(Add to Container)
- 2. **使用(Usage)**
- 3. **销毁(Destruction)**
Spring Bean 生命周期= 生产 → 使用 → 销毁
生产阶段包括:Bean 定义、Bean 创建、Bean 注册
创建 bean包括:创建实例、添加属性、初始化实例、注册销毁
1.生产(Production)
目标:让 Bean 变成容器中一个可用的对象。
(1)定义 Bean(Bean Definition)
- 含义:在 Spring 容器启动时,通过 XML、注解(如
@Component)、Java Config(@Bean)等方式注册 Bean 的元数据。 - 技术体现:生成
BeanDefinition对象,存入BeanFactory的BeanDefinitionMap。 - 注意:此时尚未创建实例,只是“蓝图”。
✅ 这一步确实属于“生产”的前置准备。
(2)创建 Bean(Bean Instantiation & Initialization)
这是核心阶段,Spring 内部称为“bean creation”,包括:
- 创建实例(Instantiation)
→ 调用构造函数 / 工厂方法,生成原始对象。 - 属性填充(Populate Properties)
→ 注入依赖(如@Autowired字段)。 - 初始化(Initialization)
→ 执行@PostConstruct、InitializingBean.afterPropertiesSet()、init-method等。 - 注册销毁回调(Register Destruction Callback)
→ 如果是单例,容器会记录其销毁方法(用于关闭时调用)。
⚠️ 注意:“注册销毁”不是“执行销毁”,而是提前登记,属于“生产”阶段的收尾工作。
(3)添加 Bean(Add to Container)
- 实际上,一旦 Bean 创建并初始化完成,Spring 就会将其放入单例池(singletonObjects)中(针对 singleton 作用域)。
- 此后其他 Bean 就可以从容器中获取它。
- 所以“添加”可理解为“将初始化完成的 Bean 缓存到容器中,供后续使用”。
2.使用(Usage)
- 应用代码通过
@Autowired、getBean()等方式获取并使用 Bean。 - 对于 singleton Bean,所有使用者共享同一个实例。
- 对于 prototype Bean,每次获取都会走一遍“创建”流程(但不归还给容器,也不管理销毁)。
3.销毁(Destruction)
- 仅适用于 singleton Bean(prototype 不由容器销毁)。
- 当容器关闭(
context.close()或registerShutdownHook()触发)时:- 调用
@PreDestroy - 调用
DisposableBean.destroy() - 调用
destroy-method
- 调用
- 容器内部会遍历
disposableBeans集合,依次销毁。
🌟 面试推荐回答模板
Spring Bean 的生命周期可以分为生产、使用和销毁三个阶段。
其中生产阶段包括 Bean 的定义、创建和注册。
创建 Bean 时又会经历实例化、属性注入、初始化,并在初始化完成后注册销毁回调。
随后 Bean 进入使用阶段,被容器管理和依赖。
容器关闭时进入销毁阶段,执行相应的销毁方法。