登录后台

页面导航

本文编写于 198 天前,最后修改于 186 天前,其中某些信息可能已经过时。

Spring Bean生命周期

调用 getBean(name) 方法来加载name对应的单例对象,这里只分析Spring的单例对象生命周期。

  1. 转换并解析bean的名称,处理bean别名,获取到真正的bean名称;
  2. 如果beanName是以&开头的,就返回FactoryBean的工厂对象本身;
  3. 如果获取的是以FactoryBean工厂自定义创建的实例对象,那么就通过FactoryBeangetObject方法来创建单例对象;
  4. 从缓存中获取单例bean;

    1. 先从单例缓存(一级缓存 singletonObjects)中获取;
    2. 如果一级获取不到,则判断当前bean是否正在创建,如果当前bean正在创建,则从早期单例缓存(二级缓存 earlySingletonObjects)中获取;
    3. 如果二级缓存获取不到,则判断当前容器是否允许早期引用,如果允许早期引用,则从对象工厂缓存(三级缓存 singletonFactories)获取bean的对象工厂ObjectFactory
    4. 调用ObjectFactorygetObject方法创建早期单例bean,并将早期单例添加到早期单例缓存(二级缓存 earlySingletonObjects)中。
  5. 如果成功获取到单例bean,先尝试通过FactoryBean来实例化bean;

    1. 判断name是否以&开头,如果单例bean是FactoryBean实例,返回单例bean;
    2. 判断单例是否是FactoryBean的实例,调用FactoryBeangetObject方法创建单例bean,返回单例bean。
  6. 未获取到单例bean,开始创建单例bean;
  7. 检查当前是否存在prototy类型的bean正在创建(prototy类型的bean无法解决循环依赖的问题);
  8. 标记beanName对应的bean开始创建;
  9. 获取bean的BeanDefinition并封装为RootBeanDifitionRootBeanDifition包含父类Bean的定义信息);
  10. 注册并提前初始化bean依赖的那些bean;
  11. 提供一个扩展点,通过后置处理器InstantiationAwareBeanPostProcessorpostProcessBeforeInstantiation方法创建并返回一个代理对象,结束创建流程;
  12. 记录beanName对应的bean开始创建;
  13. 正式创建单例bean;

    1. 解析BeanDifinition中bean属性class;
    2. BeanDifinition中预先标记没有重载的方法;
    3. 通过反射创建bean的实例;
    4. 将bean的实例封装到BeanWrapperImpl中;
    5. 通过后置处理器MergedBeanDefinitionPostProcessor的方法postProcessMergedBeanDefinition用来合并一些信息到BeanDefinition,例如将添加了@Autoired@Resource等注解信息加入到BeanDefinition中,默认的处理器有:CommonAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessorInitDestroyAnnotationBeanPostProcessor等;
    6. 当前bean为单例,设置允许循环且bean正在创建;
    7. 添加创建早期单例bean的对象工厂ObjectFactory到三级缓存中(对象工厂缓存 singleFactories);
    8. 调用后置处理器InstantiationAwareBeanPostProcessorpostProcessAfterInstantiation方法来去修改bean的状态,如果该方法返回false,将会跳过步骤9及步骤10(即为bean填充各种属性值)
    9. 通过后置处理器InstantiationAwareBeanPostProcessorpostProcessProperties方法处理bean属性值的扩展点,其中AutowiredAnnotationBeanPostProcessor后置处理器用于处理带有@Autowired@Value注解的字段,利用反射API来完成属性值的注入;
    10. 为bean填充各种属性值;
    11. 调用感知接口的方法(即相关Aware接口),为bean注入容器中的内置对象;
    12. 在bean初始化之前通过后置处理器BeanPostProcessorpostProcessBeforeInitialization方法调整bean;
    13. 通过后置处理器InitDestroyAnnotationBeanPostProcessorpostProcessBeforeInitialization方法来执行@PostConstruct注解标注的初始化方法;
    14. 执行bean中的初始化方法:

      1. 先判断bean是否实现InitializingBean接口,如果实现则执行afterPropertiesSet方法;
      2. 执行初始化方法init-method中指定的方法;
    15. 在bean初始化之后通过后置处理器BeanPostProcessorpostProcessAfterInitialization方法调整bean,其中后置处理器AnnotationAwareAspectJAutoProxyCreator在其抽象父类的父类的父类AbstractAutoProxyCreator中的postProcessAfterInitialization方法中实现了AOP功能
    16. 注册DisponsableBeanAdapter在销毁bean时执行方法:

      1. 先调用后置处理器DestructionAwareBeanPostProcessorpostProcessBeforeDestruction方法来执行bean的销毁处理,默认的后置处理器InitDestroyAnnotationBeanPostProcessorpostProcessBeforeDestruction方法用来执行@PreDestroy注解标注的销毁方法;
      2. 先判断bean是否实现DisponsableBean接口,如果实现则执行destroy方法;
      3. 执行销毁方法destory-mehtod中指定的方法;
  14. 如果是首次创建实例bean,需要将创建好的实例bean添加到单例缓存(一级缓存 singletonObjects)中,删除对象工厂缓存(三级缓存 singletonFactories)和早期单例缓存(二级缓存 earlySingletonObjects)中对应的缓存。并在registeredSingletons中记录已经创建过的bean名称, 防止单例bean的重复创建;
  15. 检查是否需要转换对象的类型。