Spring生命周期

在阅读其他开源框架时,或是Spring Aop/Transaction的源码时,这些框架的特性和spring的生命周期息息相关,因此整理一下,如发现遗漏,在补充

  1. ApplicationContext生命周期

创建流程,从AbstractApplicationContext的refresh方法开始

  • 初始化beanfactory,使用的是DefaultListableBeanFactory
  • loadBeanDefinitions
  • prepareBeanFactory配置容器基础特性(比如配置classloader和BeanPostProcessor)
  • postProcessBeanFactory(beanFactory) 子类实现对容器的自定义配置
  • invokeBeanFactoryPostProcessors(beanFactory) 执行容器后处理器,分为2种,BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor,先执行BeanDefinitionRegistryPostProcessor里的postProcessBeanDefinitionRegistry回调,再执行BeanFactoryPostProcessor中的postProcessBeanFactory回调
  • registerBeanPostProcessors(beanFactory); 注册bean后处理器
  • initMessageSource();
  • initApplicationEventMulticaster();
  • onRefresh();
  • registerListeners();
  • finishBeanFactoryInitialization(beanFactory); 在这里面会调用beanFactory.preInstantiateSingletons();来预先初始化lazyInit=false的bean
  • finishRefresh();

销毁流程,ApplicationContext的销毁可以手动调用close方法触发,也可以在jvm结束时,通过ShutdownHook触发

  • destroyBeans();
  • closeBeanFactory();
  • onClose();
  1. spring bean的生命周期

创建bean流程,从DefaultListableBeanFactory的getBean方法开始

  • 先从缓存earlySingletonObjects中取bean,这一步用于解决循环依赖,取到直接返回
  • 根据bean的类型创建bean,从AbstractBeanFactory的createBean方法开始,这个抽象方法由AbstractAutowireCapableBeanFactory实现
  • 对bean对应的RootBeanDefinition进行配置
  • Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 使用InstantiationAwareBeanPostProcessor中的postProcessBeforeInstantiation回调预先实例化bean,通常用于生成代理,如果这一步得到bean对象,直接返回这个bean
  • 实例化bean,相当于new 一个对象,依赖的属性并没有注入
  • applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); 调用MergedBeanDefinitionPostProcessor的回调方法对beandefinition进行修改
  • 将还未完全初始化完成的bean放入缓存earlySingletonObjects,用于解决循环依赖问题
  • 进入populateBean方法逻辑
  • 调用使用InstantiationAwareBeanPostProcessor中的postProcessAfterInstantiation回调处理实例化后的bean
  • 替换PropertyValues中的ref为实际引用,这一步执行依赖注入
  • 调用使用InstantiationAwareBeanPostProcessor中的postProcessPropertyValues对PropertyValues进行处理
  • bean注入PropertyValues
  • 进入initializeBean方法逻辑
  • invokeAwareMethods(beanName, bean);调用aware方法
  • applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 执行BeanPostProcessor的postProcessBeforeInitialization方法
  • 初始化bean invokeInitMethods(beanName, wrappedBean, mbd);先执行InitializingBean接口的afterPropertiesSet方法,再执行自定义init方法
  • applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);执行BeanPostProcessor的postProcessAfterInitialization方法,在这一步会生成代理
  • bean初始化完成

销毁bean流程,在Application的destroyBeans方法后触发

  • 注册销毁bean的回调
  • 调用bean实现DisposableBean接口destory方法
  • 调用bean的自定义destory方法

你可能感兴趣的:(Spring生命周期)