Spring生命周期
2018-02-28 本文已影响39人
土豆肉丝盖浇饭
在阅读其他开源框架时,或是Spring Aop/Transaction的源码时,这些框架的特性和spring的生命周期息息相关,因此整理一下,如发现遗漏,在补充
- 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();
- 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方法