Spring Bean 的生命周期是怎样的?
整个生命周期大致可分为三个大的阶段,分别是:创建、使用、销毁。 还可以进一步分为五个小的阶段:实例化、初始化、注册 Destruction 回调、Bean 的正常使用以及 Bean 的销毁。
1. Bean 的定义和实例化
- BeanDefinition 加载:Spring 容器(如
ApplicationContext
)启动时,解析配置(XML、Java Config、注解等),生成BeanDefinition
对象,描述 Bean 的元数据。 - 实例化:通过构造函数或工厂方法创建 Bean 的实例(此时对象处于“原始”状态,未注入依赖)。
2. 依赖注入(属性赋值)
- 填充属性:根据配置(如
@Autowired
、@Value
、XML 的<property>
)注入依赖的 Bean 或简单值。 - Aware 接口回调(可选):若 Bean 实现了特定
Aware
接口,Spring 会按顺序调用方法:BeanNameAware
→ 设置 Bean 的名称。BeanClassLoaderAware
→ 设置类加载器。BeanFactoryAware
→ 设置BeanFactory
引用。EnvironmentAware
、ApplicationContextAware
等 → 注入上下文相关对象。
3. BeanPostProcessor 前置处理
postProcessBeforeInitialization()
:所有BeanPostProcessor
在此阶段对 Bean 进行扩展处理(如修改属性值)。
4. 初始化阶段
@PostConstruct
注解方法:通过反射调用标记的方法。InitializingBean
接口:实现afterPropertiesSet()
方法,在属性注入完成后执行。- 自定义初始化方法:通过 XML 的
init-method
或@Bean(initMethod = "...")
指定。
5. BeanPostProcessor 后置处理
postProcessAfterInitialization()
:对初始化后的 Bean 进行处理(如生成 AOP 代理对象)。
6. Bean 就绪
- 完成所有初始化后,Bean 被放入容器,可被其他对象依赖使用。
7. 销毁阶段(容器关闭时触发)
@PreDestroy
注解方法:通过反射调用标记的销毁逻辑。DisposableBean
接口:实现destroy()
方法。- 自定义销毁方法:通过 XML 的
destroy-method
或@Bean(destroyMethod = "...")
指定。