SpringFramework源码解析——@PostConstruct和@PreDestroy是如何生效的?
作者:徐梦旗,发布于:2023年08月05日 22:54,字数:470,预计阅读:1分钟
1. 背景
在Bean的实例化之后,会进行Bean的初始化,也就是会调用Bean的初始化方法。有以下几种方式指定Bean的初始化方法:
- 标注
@PostConstruct
注解到初始化方法上; - 实现
InitializingBean
接口的afterPropertiesSet
方法; - 指定
BeanDefinition
的初始化方法。
在Bean的销毁之前,会调用Bean的销毁方法。有以下几种方式指定Bean的销毁方法:
- 标注
@PreDestroy
注解到销毁方法上; - 实现
DisposableBean
接口的destroy
方法; - 指定
BeanDefinition
的销毁方法。
本文将探究@PostConstructor
注解和@PreDestroy
注解是如何生效的。
2. @PostConstruct和@PreDestroy是如何生效的?
CommonAnnotationBeanPostProcessor
后置处理器实现了@PostConstruct
注解的初始化逻辑和@PreDestory
注解的销毁逻辑,其实现了以下两个方法:
BeanPostProcessor#postProcessBeforeInitialization
方法:Spring在进行Bean的初始化时调用;DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
方法:Spring在进行Bean的销毁时调用。
3. @PostConstruct初始化方法详解
@PostConstruct
初始化方法执行的步骤如下:
- 获取
Class
中标注@PostConstruct
注解的所有方法,并封装为初始化方法生命周期元素集合,然后构建一个LifecycleMetadata
生命周期元数据返回; - 调用
LifecycleMetadata
生命周期元数据的invokeInitMethods
方法; - 依次调用初始化方法
LifecycleElement
生命周期元素的invoke
方法,通过反射的方式执行初始化方法。
4. @PreDestroy销毁方法详解
@PreDestroy
销毁方法执行的步骤如下:
- 获取
Class
中标注@PreDestroy
注解的所有方法,并封装为销毁方法生命周期元素集合,然后构建一个LifecycleMetadata
生命周期元数据返回; - 调用
LifecycleMetadata
生命周期元数据的invokeDestroyMethods
方法; - 依次调用销毁方法
LifecycleElement
生命周期元素的invoke
方法,通过反射的方式执行销毁方法。