Spring Bean生命周期笔记

近期对之前学习的Spring源码进行了简单的回顾,现扫地生记录一下Spring中Spring Bean的生命周期:

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

小结:

  1. 上面 123 属于 BeanDefinition 配置元信息阶段,算是 Spring Bean 的前身,想要生成一个 Bean 对象,需要将这个 Bean 的所有信息都定义好;
  2. 其中 45 属于实例化阶段,想要生成一个 Java Bean 对象,那么肯定需要根据 Bean 的元信息先实例化一个对象;
  3. 接下来的 6 属于属性赋值阶段,实例化后的对象还是一个空对象,我们需要根据 Bean 的元信息对该对象的所有属性进行赋值;
  4. 后面的 789 属于初始化阶段,在 Java Bean 对象生成后,可能需要对这个对象进行相关初始化工作才予以使用;
  5. 最后面的 1011 属于销毁阶段,当 Spring 应用上下文关闭或者主动销毁某个 Bean 时,可能需要对这个对象进行相关销毁工作,最后等待 JVM 进行回收。
向大神看齐
原文地址:https://www.cnblogs.com/Liu-xing-wu/p/15361124.html