从BeanFactory源码看Bean的生命周期


下图是我搜索“Spring Bean生命周期”找到的图片,来自文章——Spring Bean的生命周期

下面,我们从AbstractAutowireCapableBeanFactory的源码中来分析这张图的各个阶段到底是怎么执行的。BeanFactory的基本源码解读在这篇文章中,如果读本篇文章稍显吃力,可以先去看看上面那篇。

我们所用到的BeanFactory,ApplicationContext基本都继承了AbstractAutowireCapableBeanFactory,它是一个具有自动装载能力的BeanFactory,它可以响应@Autowire注解,所以,单独分析这个类不是没用的,而且很有必要。

同时,由于Spring的BeanFactory层次结构中大量的使用了模板模式,所以我们可能在这个类的父子类中跳入跳出。

Bean生命周期简单描述

  1. 从BeanDefinition创建实例化Bean
  2. 实例化之前如果有InstantiationAwareBeanPostProcessor,调用before实例化方法
  3. 如果并没有一个实例化BeanPostProcessor接管Bean创建,那么进入正常实例化阶段
  4. 实例化Bean
  5. 调用InstantiationAwareBeanPostProcessor的after实例化方法
  6. 对pvs进行设置
  7. 调用InstantiationAwareBeanPostProcessor的postProcessProperties方法对pvs进行修改
  8. 实际的Bean属性设置

初始化阶段

需要注意的是,一旦你的Bean实现了某个Aware接口,就证明它要感知到某些框架中的东西,这会让它直接与框架产生耦合。

BeanPostProcessor before初始化的调用

不过这个图应该画错了,它把DestructionAwareBeanPostProcessors写成了InstantiationAwareBeanPostProcessor

看看它被调用的构造方法里写了啥:

public DisposableBeanAdapter(Object bean, String beanName, RootBeanDefinition beanDefinition,
        List<DestructionAwareBeanPostProcessor> postProcessors, @Nullable AccessControlContext acc) {

    this.bean = bean;
    this.beanName = beanName;
    this.nonPublicAccessAllowed = beanDefinition.isNonPublicAccessAllowed();
    // 该Bean是不是可调用的DisposableBean
    this.invokeDisposableBean = (bean instanceof DisposableBean &&
            !beanDefinition.hasAnyExternallyManagedDestroyMethod(DESTROY_METHOD_NAME));
    
    // destroy方法名
    String destroyMethodName = inferDestroyMethodIfNecessary(bean, beanDefinition);

    // 和初始化哪里一样,防止destroy方法名和DisposableBean的方法名一样,重复调用
    if (destroyMethodName != null &&
            !(this.invokeDisposableBean && DESTROY_METHOD_NAME.equals(destroyMethodName)) &&
            !beanDefinition.hasAnyExternallyManagedDestroyMethod(destroyMethodName)) {
        // 如果Bean是一个AutoClosable并且自定义的销毁方法名也是close的话
        this.invokeAutoCloseable = (bean instanceof AutoCloseable && CLOSE_METHOD_NAME.equals(destroyMethodName));

        if (!this.invokeAutoCloseable) {
            // 如果不是,destroyMethodName就使用用户指定的并解析对应方法
            this.destroyMethodName = destroyMethodName;
            Method destroyMethod = determineDestroyMethod(destroyMethodName);
            // 省略一些destroy method参数设置相关的代码
            this.destroyMethod = destroyMethod;
        }
    }
    // 获取beanPostProcessors(filterPostProcessors会过滤掉所有非DestructionAwareBeanPostProcessor的类)
    this.beanPostProcessors = filterPostProcessors(postProcessors, bean);
    this.acc = acc;
}

这里就是做了一些初始化工作,把需要的成员变量都解析出来,方便后面destroy时使用。

然后我们看看destroy方法:

public void destroy() {
    // 调用所有DestructionAwareBeanPostProcessor的postProcessBeforeDestruction
    if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
        for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
            processor.postProcessBeforeDestruction(this.bean, this.beanName);
        }
    }

    // 如果是一个disposableBean,调用它的destroy
    if (this.invokeDisposableBean) {
        ((DisposableBean) this.bean).destroy();
    }

    // 如果是AutoCloseable(并且自定义销毁方法名也是close),直接调用close
    if (this.invokeAutoCloseable) {
        ((AutoCloseable) this.bean).close();
    }
    // 否则去调用自定义方法
    else if (this.destroyMethod != null) {
        invokeCustomDestroyMethod(this.destroyMethod);
    }
    // 有可能存在destroyMethod没解析,但是destroyMethodName有了的情况,解析并调用
    else if (this.destroyMethodName != null) {
        Method destroyMethod = determineDestroyMethod(this.destroyMethodName);
        if (destroyMethod != null) {
            invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(destroyMethod, this.bean.getClass()));
        }
    }
}

实战DestructionAwareBeanPostProcessor#

  1. 从BeanDefinition获取Bean信息
  2. 调用InstantiationAwareBeanPostProcessor的before实例化方法
  3. 如果它返回一个对象,那么直接进入该对象的初始化后方法
  4. 否则,它返回null,进入正常的Bean生命周期
  5. 实例化Bean
  6. 调用populateBean,该方法的目的是对Bean属性进行设置
  7. 调用InstantiationAwareBeanPostProcessor的after实例化方法,该方法的返回值决定是否跳过属性设置阶段
  8. 解析该Bean的pvs,自动注入该pvs
  9. 调用InstantiationAwareBeanPostProcessor中两个和属性设置有关的方法,允许它们对属性进行动态修改
  10. 调用initializingBean进入初始化阶段
  11. 检测Bean实现了哪些Aware接口,调用它们
  12. 调用所有BeanPostProcessor的before初始化方法,该方法可以返回Bean的一个代理
  13. 如果Bean是InitializingBean,调用它的afterPropertiesSet方法
  14. 如果Bean设置了启动方法,调用启动方法
  15. 调用所有BeanPostProcessor的after初始化方法,该方法可以返回Bean的一个代理
  16. 调用destroyBean进入Bean销毁阶段
  17. 创建DisposableBeanAdapter,它负责对Bean的销毁进行生命周期方法的调用
  18. 调用所有DestructionAwareBeanPostProcessor的before销毁方法
  19. 如果是DisposableBean,调用destroy方法
  20. 如果设置了destroy-method,调用它
参考原文链接:https://www.cnblogs.com/lilpig/p/16477006.html