SpringBean生命周期个人总结

106 阅读1分钟

前言

  在了解Spring Bean生命周期时,首先要确立流程骨架,即其只有四个阶段!

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

  即** 实例化 → 属性赋值 → 初始化 → 销毁**
实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。这四阶段中穿插各种扩展点组成完整的SpringBean生命周期。

源码分析(简化版)

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
       BeanWrapper instanceWrapper = null;
     
       if (instanceWrapper == null) {
       	// 实例化阶段
           instanceWrapper = this.createBeanInstance(beanName, mbd, args);
       }
      Object bean = instanceWrapper.getWrappedInstance();
       Object exposedObject = bean;

       try {
       	   // 属性赋值阶段
           this.populateBean(beanName, mbd, instanceWrapper);
           // 初始化阶段
           exposedObject = this.initializeBean(beanName, exposedObject, mbd);
       }

常用扩展点

影响多个Bean的接口

  实现了这些接口的Bean会切入到多个Bean的生命周期中。正因为如此,这些接口的功能非常强大,Spring内部扩展也经常使用这些接口,例如自动注入以及AOP的实现都和他们有关。

  • InstantiationAwareBeanPostProcessor
  • BeanPostProcessor

这两个接口可能是Spring扩展中最重要的两个接口!前者作用于实例化阶段的前后,后者作用于初始化阶段的前后。正好和第一、第三个生命周期阶段对应。通过图能更好理解: 图片丢失