概述
BeanDefinition 是 Spring 框架中的一个核心概念,通过XML 配置或注解把一个 Bean 的元数据信息封装成一个 BeanDefinition对象
。Spring 容器在在进行实例化时,会根据 BeanDefinition
创建和管理 Bean 实例。BeanDefinition
包含了 Bean 的类名、作用域、属性值、初始化方法、销毁方法等信息。
直接上图:
Bean的生命周期主要分为以下几个核心阶段:
- 实例化(Instantiation)
- 属性赋值(Population of Properties)
- 初始化(Initialization)
- 使用(In Use)
- 销毁(Destruction)
详细流程:
实例化阶段:
- 通过 BeanDefinition 获取 bean 的定义信息
- 调用构造函数实例化 bean
属性赋值:
- Spring 容器将配置的属性值或依赖的 Bean 注入到目标 Bean 中。
- 支持通过 Setter 方法、字段注入或构造函数注入。
初始化前的拓展机制:
处理 Aware 接口 (BeanNameAware 、 BeanFactoryAware 、 ApplicationContextAware),见名知意,即获取Bean名称、工厂、上下文。
初始化前:
在bean初始化之前,可以通过BeanPostProcessor接口(中的postProcessBeforeInitialization方法)对Bean进行一些额外的处理。
初始化:
实现InitializingBean接口,执行初始化逻辑 或定义自定义初始化方法 init-method。
初始化后:
在bean初始化之前,可以通过BeanPostProcessor接口(中的postProcessAfterInitialization方法)对Bean进行一些额外的处理。
使用:
完成初始化后,可被容器中的其他Bean使用。
在单例模式下,Bean 会被缓存,后续请求直接返回同一个实例。
销毁:
当 Spring 容器关闭时,会执行 Bean 的销毁逻辑。以下是销毁的扩展点:
-
@PreDestroy
注解:
标记一个方法,在 Bean 销毁时调用。 -
DisposableBean.destroy()
:
实现DisposableBean
接口,在 Bean 销毁时执行 destroy() 方法。 - 自定义销毁方法:
通过destroy-method
属性(XML 配置)或@Bean(destroyMethod = "...")
指定销毁方法。
Bean 的作用域(Scope)与生命周期的关系
Spring Bean 的生命周期还与其作用域密切相关:
Singleton(单例)
默认作用域,Bean 的生命周期与 Spring 容器的生命周期一致。在容器启动时创建,在容器关闭时销毁。
Prototype(原型):
每次请求时创建一个新的 Bean 实例,容器只负责创建,不管理其生命周期(不调用销毁方法)
Request、Session、Application、 WebSocket:
这些作用域用于 Web 应用中,Bean 的生命周期分别与 HTTP 请求、会话、应用或 WebSocket 的生命周期一致。