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方法,通过反射的方式执行销毁方法。
