本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处
Spring Bean生命周期细分为以下阶段:
Spring Bean生命周期
我将Bean的生命周期理解为由两个主要过程组成:创建过程以及销毁过程。
源码阅读
Bean创建过程
Bean创建过程的代码入口在AbstractAutowireCapableBeanFactory的createBean方法。
Bean实例化过程
实例化前阶段
-
实例化前阶段是在AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation中执行。
resolveBeforeInstantiation -
其中这里的applyBeanPostProcessorsBeforeInstantiation方法是执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation回调方法。
applyBeanPostProcessorsBeforeInstantiation - 这里需要注意的是如果InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法返回的是一个not null对象。beanFactory会直接通过applyBeanPostProcessorsAfterInitialization方法执行Bean初始化后置阶段,中间的所有bean生命周期过程都会跳过。
实例化阶段
-
AbstractAutowireCapableBeanFactory的doCreateBean方法中,createBeanInstance方法就是bean实例化代码,这个方法会根据对应beanDefinition的定义使用不同的策略进行bean的实例化操作:工厂方法、构造器自动注入方法以及普通实例化方法
doCreateBean
实例化后阶段
-
doCreateBean中的populateBean方法中除了Bean的赋值操作之外,其实还包含了实例化后阶段操作,以下是populateBean中具体的实例化后阶段的代码执行,这里是通过遍历方式执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation回调方法
populateBean中实例化后阶段代码段
Bean赋值阶段
赋值前阶段
-
Bean的赋值前阶段同样是在populateBean中完成,这里以遍历方式执行InstantiationAwareBeanPostProcessor的postProcessProperties回调方法
populateBean中赋值前阶段代码段
赋值阶段
populateBean中的applyPropertyValues是Bean的赋值阶段操作核心方法,这里是将BeanDefinition中的PropertyValue赋值给Bean实例
Bean初始化阶段
AbstractAutowireCapableBeanFactory的initializeBean方法是Bean初始化阶段的入口invokeAwareMethods
Aware接口回调
-
进入到initializeBean方法后首先会看到Aware接口回调的入口
initializeBean的Aware接口回调 -
invokeAwareMethods会依次回调BeanNameAware、BeanClassLoaderAware以及BeanFactoryAware
invokeAwareMethods
Bean初始化前阶段
-
在执行完Aware接口回调后,就会执行applyBeanPostProcessorsBeforeInitialization进行初始化前阶段的操作了
initializeBean的初始化前阶段 -
applyBeanPostProcessorsBeforeInitialization以遍历方式执行BeanPostProcessor的postProcessBeforeInitialization回调方法。
其中这里会调用的InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法(通过子类CommonAnnotationBeanPostProcessor调用),此方法会回调@PostConstruct标记的初始化方法
applyBeanPostProcessorsBeforeInitialization
Bean初始化阶段
- 在执行完Bean初始化前阶段操作后,就是执行invokeInitMethods进行初始化阶段的操作了
-
在invokeInitMethods初始化阶段中,如果Bean实现了InitializingBean接口,首先会先执行InitializingBean的afterPropertiesSet方法,如下图
InitializingBean接口方法调用 -
然后就会执行BeanDefinition中的自定义初始化方法,如下图
BeanDefinition自定义方法执行
Bean初始化后阶段
-
执行完invokeInitMethods后,就会调用applyBeanPostProcessorsAfterInitialization,执行Bean初始化后阶段操作,如下图
image.png -
在applyBeanPostProcessorsAfterInitialization中以遍历方式回调BeanPostProcessor的postProcessAfterInitialization方法
applyBeanPostProcessorsAfterInitialization
Bean初始化完成阶段
- Bean初始化完成阶段是4.1版本才出现的,所以4.1之前的framework代码中是没有这个阶段的操作。
-
这里注意需要Bean类实现SmartInitializingSingleton接口的afterSingletonsInstantiated方法
初始化完成代码段
Bean销毁阶段
Bean的销毁方法可以通过容器关闭的方法一步步进入到里面看到,单例Bean的销毁过程主要在DisposableBeanAdapter类的destroy方法中执行,在DefaultSingletonBeanRegistry(AbstractBeanFactory的父类)中会有一个集合存放这这些DisposableBeanAdapter,每个Bean对应一个DisposableBeanAdapter实例
Bean销毁前阶段
-
其中销毁前阶段是通过DisposableBeanAdapter类以遍历方式回调DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法
image.png -
其中@PreDestroy标记的销毁方法是在这里通过InitDestroyAnnotationBeanPostProcessor(DestructionAwareBeanPostProcessor的实现类)的postProcessBeforeDestruction方法进行回调操作
image.png
Bean销毁阶段
-
完成了Bean的销毁前阶段操作后,在DisposableBeanAdapter的destroy方法中,会调用DisposableBean的destroy方法,如下图:
调用DisposableBean接口方法的代码段 -
紧接着又会通过invokeCustomDestroyMethod调用BeanDefinition中定义的自定义销毁方法,如下图
调用自定义销毁方法的代码段
总结
Bean的生命周期主要分为创建过程和销毁过程。创建又分为实例化前置阶段、实例化阶段、实例化后置阶段、赋值前置阶段、赋值阶段、初始化前置阶段、初始化阶段、初始化后置阶段、初始化完成阶段。销毁又分为销毁前置阶段以及销毁阶段
Bean的生命周期设计里面,Spring开发人员留了多个扩展接口让用户能干预Bean创建和销毁。但是需要注意的是开发人员要了解每个扩展接口的执行顺序以及里面的一些代码细节,才能更好地使用这些扩展接口在日常开发上。
网友评论