Bean的生命周期其实就是Spring从创建到销毁一个Bean的过程。下面试流程的大致梗概:
-
BeanDefinition阶段
- 扫描解析Bean类为BeanDefinition,注册到BeanDefinitionRegistry的BeanDefinitionMap中
- 创建Bean之前,对于存在类继承的,会进行BeanDefinition合并。
- BeanFactoryPostProcessor对BeanDefinition的修改工作
-
Bean实例化阶段:createBeanInstance
- 这个阶段后处理bean:InstantiationAwareBeanPostProcessor[postProcessBeforeInstantiation、postProcessAfterInstantiation]
- 实例化之前执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation,执行这些后处理器实例化之前定义方法。
- SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors Spring会选择最优的构造器来实例化bean。
- MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 主要获取后面需要自动注入的一些注解信息。
- SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference 获取提前曝光的对象放入三级缓存中
- 执行所有的InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
-
Bean属性赋值阶段:populateBean
- 主要执行InstantiationAwareBeanPostProcessor的postProcessProperties方法来对@Autowired @Value 这些注解进行赋值注入
-
Bean初始化阶段:initializeBean
- 依次检查bean实现的aware接口,然后依次调用aware对应的方法实现。
- 执行所有的BeanPostProcessor的前置处理
- 执行初始化方法:InitializingBean 接口,或者xml配置init-method方法或者PostConstruct 注解
- 执行所有的BeanPostProcessor的后置处理
-
Bean销毁阶段
- 注册销毁方法
- 检查是否实现了DisposableBean接口等标注销毁方法
- 执行销毁方法。
如果需要再抽象一点,其实Spring构建一个Bean的过程可以只分为4个部分:实例化 -> 属性赋值 -> 初始化 -> 销毁。这是生命周期的核心流程。通过这4个基本点,然后进行扩展的去描述即可。
我们知道生命周期的主要作用就是,了解到了Spring为我们提供了参与生命周期的一些切入点,这样我们灵活的参与进入对Bean的某些定制化修改。
Spring的一些切入点如下:
- BeanFactoryPostProcessor
- Bean后置处理器
- 初始化方法等
不仅仅我们可以通过这些切入点完成我们的想要的定制化,Spring内部在实现很多机制的时候也是大量的使用到了这些切入点和扩展点,了解生命周期这个的意义我觉得更多在于这些方面。