Spring生命周期

作者: 土豆肉丝盖浇饭 | 来源:发表于2018-02-28 11:41 被阅读39次

    在阅读其他开源框架时,或是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方法开始

    • 先从缓存中取bean,这一步用于解决循环依赖
    • 从parent容器取bean
    • 先初始化该bean强制依赖的bean,通过dependon指定
    • 根据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放入缓存,用于解决循环依赖问题
    • 进入populateBean方法逻辑
    • 调用使用InstantiationAwareBeanPostProcessor中的postProcessAfterInstantiation回调处理实例化后的bean
    • 替换PropertyValues中的ref为实际引用,这一步会初始化依赖的bean
    • 调用使用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生命周期

        本文链接:https://www.haomeiwen.com/subject/ansbxftx.html