兄弟们,今天我们来看一下Spring面试题中的一个经典考点:Spring中Bean的生命周期。本文会先介绍Bean生命周期的各个阶段,并点出各个阶段重点做了哪些事情。随后会找到各个生命周期对应的源码位置。
生命周期流程
- 初始化阶段:创建Bean对象,通过反射或工厂方法
- 填充属性阶段:
@Value
、@Autowired
、@Resource
等注解标注的属性,在此阶段完成属性设置
AutowiredAnnotationBeanPostProcessor
:用于解析@Value
、@Autowired
CommonAnnotationBeanPostProcessor
:用于解析@Resource
- 执行Aware方法:
BeanNameAware
、BeanFactoryAware
等实现方法开始执行
ApplicationContextAware
、ApplicationEventPublisherAware
等接口,虽然也是Aware
,但是它们是通过ApplicationContextAwareProcessor
执行postProcessBeforeInitialization
才执行的
- 执行
**BeanPostProcessor**
实例化前方法:执行BeanPostProcessor#postProcessBeforeInitialization
ApplicationContextAwareProcessor
:执行部分Aware接口的实现方法CommonAnnotationBeanPostProcessor
:@PostConstruct
标注的方法执行
- 执行实例化方法
实例化方法有3种定义方式:
@PostConstruct
:在第4步中,通过CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization
执行InitializingBean
实现方法执行init-method
方法执行执行顺序:
@PostConstruct
>InitializingBean
>init-method
- 执行
**BeanPostProcessor**
实例化后方法:BeanPostProcessor#postProcessAfterInitialization
ApplicationListenerDetector
:将实现ApplicationListener
的Bean添加到Spring应用上下文的ApplicationListener
列表AnnotationAwareAspectJAutoProxyCreator
:AOP代理对象的创建
- 注册可销毁的Bean
判断依据,首先不能是原型Bean,此外需要满足下面3个条件之一
- 实现了
DisposableBean
- 定义了
destroy
方法- 有
DestructionAwareBeanPostProcessor
可以处理
- Bean的使用
- 执行
**DestructionAwareBeanPostProcessor**
销毁前方法:执行DestructionAwareBeanPostProcessor#postProcessBeforeDestruction
ApplicationListenerDetector
:若销毁的Bean实现了ApplicationListener
,从Spring应用上下文的ApplicationListener
列表移除CommonAnnotationBeanPostProcessor
:执行@PreDestroy
标注的方法
- 执行销毁方法
销毁方法有3种定义方式:
@PreDestroy
:在第9步中,通过CommonAnnotationBeanPostProcessor#postProcessBeforeDestruction
执行DisposableBean
实现方法destroy
方法执行执行顺序:
@PreDestroy
>DisposableBean
>destroy
源码定位
生命周期的对应代码位置,大家可以定位下面的方法
AbstractAutowireCapableBeanFactory#doCreateBean
整体概览
初始化
初始化阶段也涉及不少逻辑,构造器推断等,不展开讲
填充属性
下面给大家Debug看下有哪些(SpringBoot2.7)
实例化Bean
执行Aware方法
执行BeanPostProcessor实例化前方法
执行实例化方法
执行BeanPostProcessor实例化后方法