Spring bean生命周期[5] 剩余事项

267 阅读1分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

到这里我们已经把生命周期主流程介绍的差不多了,接下来就是最后一步,执行bean回调方法了:

第三步 - 执行bean初始化回调

所有非懒加载的单例bean创建完之后,调用是SmartInitializingSingleton实现的单例bean的afterSingletonsInstantiated来执行。

 // Trigger post-initialization callback for all applicable beans...
 for (String beanName : beanNames) {
    Object singletonInstance = getSingleton(beanName);
    if (singletonInstance instanceof SmartInitializingSingleton) {
       StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
             .tag("beanName", beanName);
       SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
       if (System.getSecurityManager() != null) {
          AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
             smartSingleton.afterSingletonsInstantiated();
             return null;
          }, getAccessControlContext());
       }
       else {
          smartSingleton.afterSingletonsInstantiated();
       }
       smartInitialize.end();
    }
 }

总结

Spring的bean生命周期,按照上面的步骤一共分为:

  • 读取beanDefinition
    • 其实从上面不难看出,BD主要代表的是一个bean的定义,关键的是其中的bean的信息、构造方法等,从而能够很方便地通过BD来构建一个bean
  • 初始化bean(createBean)
    • 这里就是bean生命周期里的核心了,在这里普通的(没有被提前加载的bean),会在这里被初始化。
    • 同时这里也有很多切入点可以让beanPostProcessor来介入,包括:实例化,属性填充
  • 调用后置处理器

createBean的流程图:www.processon.com/diagraming/…

  • beanPostProcessor有这几个关键子类:
 //初始化相关,初始化之前没有的话,createBean的时候就不会先让beanPostProcessor来代理;实例化后也会调这个
 final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>();
 ​
 final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>();
 ​
 final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>();
 ​
 //这里用来处理合并好的beanDefinition
 final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>();
  • BeanPostProcessor在这里有这么几个注入点:

    • InstantiationAwareBeanPostProcessor - 初始化bean(调用postProcessBeforeInstantiation)

      • 如果上一步有,beanPostProccssor尝试处理这个bean(调用postProcessAfterInitialization
    • 处理BD:beanPostProcessor(MergedBeanDefinitionPostProcessor)来处理BD(postProcessMergedBeanDefinition
    • InstantiationAwareBeanPostProcessor:填充属性postProcessAfterInstantiation,这里针对的是bean级别的而不是依赖级别的
    • InstantiationAwareBeanPostProcessor:循环调用postProcessProperties处理属性,这里是@Autowired的作用的地方,针对的是bean中的依赖级别的