Bean的完整生命周期可以认为是从容器创建初始化Bean开始,直到Spring容器关闭。
主要包括3个阶段:Bean定义(加载解析) -------> Bean实例化 ------> Bean初始化
具体来说的话:主要分为以下几个步骤:
1.实例化bean对象,设置对象属性(按照Bean定义信息配置信息,注入所有的属性,)
2.检查是否Aware相关接口并设置相关依赖
3.bean实例的初始化:包括->
检查是否是IniitializingBean以及决定是否调用afterPropertiesSet方法
检查是否配置有自定义的init-method
4.使用
5.容器关闭,bean销毁
但是围绕这些步骤中,也就是bean定义-bean实例化-bean初始化3个主要阶段,Spring又配置了很多后置处理器,用来对这些阶段进行动态扩展,主要是:BeanFactoryPostProcessor,BeanPostProcessor后置处理器
BeanFactoryPostProcessor后置处理器在bean实例化前后的初始化之前的操作
BeanPostProcessor后置处理器在bean初始化前后进行操作
所以bean的生命周期又会在这三个阶段的前后进行一些相关的扩展的步骤加入,具体来说:
1.bean定义解析加载阶段
比如:BeanDefinitionRegistryPostProcessor,这个接口是BeanDefinitionRegistry的后处理器,
它允许在BeanFactoryPostProcessor被调用之前对BeanDefinition做一些操作
他的postProcessBeanDefinitionRegistry方法在Bean被定义但还没被创建的时候执行.
2.bean实例化阶段前后
这个阶段前后主要是织入BeanFactoryPostProcessor后置处理器
BeanFactoryPostProcessor就是BeanFactory的后处理类, 我们可以在BeanFactory初始化之后做一些操作. 它提供了个postProcessBeanFactory()方法, 这个方法被调用的时候, 所有的Bean已经被创建, 但是还没有被初始化. 也就是说, 通过它我们可以在初始化任何Bean之前, 做各种操作, 甚至读取并修改BeanDefinition(bean定义的元数据).
3.bean初始化阶段前后
初始化之前:
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
初始化之后:
如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;