近期对之前学习的Spring源码进行了简单的回顾,现扫地生记录一下Spring中Spring Bean的生命周期:
- Spring Bean元信息配置阶段,可以通过面向资源(XML或Properties)、面向注解、面向API进行配置。
- Spring Bean元信息解析阶段,对于第1步的配置元信息进行解析,解析成BeanDefinition对象,该对象包含定义Bean的所有信息,用于实例化一个Spring Bean。
- Spring Bean元信息注册阶段,将BeanDefinition配置元信息保存到BeanDefinitionRegistry的ConcurrentHashMap记录中。
- Spring BeaDefinition合并阶段,定义的Bean可能存在层次性关系,则需要将它们进行合并,存在相同配置则覆盖父属性,最终生成一个RootBeanDefinition对象。
- Spring Bean的实例化阶段,首先得通过类加载器加载出一个Class对象,通过这个Class对象的构造器创建一个实例对象,构造器注入在此处会完成。在实例化阶段Spring提供了实例化前后两个扩展点:
- InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
- InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation
- Spring Bean属性赋值阶段,在Spring实例化后,需要对其相关属性进行赋值,注入依赖的对象。首先获取该对象所有属性与属性值的映射,可能已定义,也可能需要注入,在这里都会进行赋值(反射机制)。依赖注入的实现是通过CommonAnnotationBeanPostProcessor(@Resource、@PostConstruct、@PreDestroy)和AutowiredAnnotationBeanPostProcessor(@Autowired、@Value)两个处理器实现的。
- Aware接口回调阶段,如果Spring Bean是Spring提供的Aware接口类型(例如BeanNameAware、ApplicationContextAware),这里会进行接口的回调,注入相关对象(例如beanName、ApplicationContext)。
- Spring Bean初始化阶段,这里会调用Spring Bean配置的初始化方法,执行顺序:@ PostConstruct标注的方法、实现InitializingBean接口的afterPropertiesSet()方法、自定义初始化方法。在初始化阶段Spring提供了初始化前后两个扩展点(BeanPostProcessorDe postProcessBeforeInitialization、postProcessAfterInitialization方法)
- Spring Bean初始化完成阶段,在所有的Bean(不是抽象、单例模式、不是懒加载方式)初始化后,Spring会再次遍历所有初始化好的单例Bean对象,如果是SmartInitialzingSingleton类型则调用器afterSingletonInstantiated()方法,这里也属于Spring提供的一个扩展点。
- Spring Bean销毁阶段,当Spring应用上下文关闭或者主动销毁某个Bean时则进入Spring Bean的销毁阶段,执行顺序:@PreDestroy注解的销毁动作、实现了DisposableBean接口的Bean的回调、destroy-method自定义的销毁方法。这里也有一个销毁前阶段处理,也属于Spring提供的一个扩展点,@PreDestroy就是基于这个实现的。
- Spring垃圾回收阶段(GC)
小结:
- 上面
1
、2
、3
属于 BeanDefinition 配置元信息阶段,算是 Spring Bean 的前身,想要生成一个 Bean 对象,需要将这个 Bean 的所有信息都定义好;- 其中
4
、5
属于实例化阶段,想要生成一个 Java Bean 对象,那么肯定需要根据 Bean 的元信息先实例化一个对象;- 接下来的
6
属于属性赋值阶段,实例化后的对象还是一个空对象,我们需要根据 Bean 的元信息对该对象的所有属性进行赋值;- 后面的
7
、8
、9
属于初始化阶段,在 Java Bean 对象生成后,可能需要对这个对象进行相关初始化工作才予以使用;- 最后面的
10
、11
属于销毁阶段,当 Spring 应用上下文关闭或者主动销毁某个 Bean 时,可能需要对这个对象进行相关销毁工作,最后等待 JVM 进行回收。