1.介绍
内容是我在编译spring源码5.2.x后,调试完源码之后通过学习时的笔记整理而成,此链接是画的一个整体的流程图示:
https://www.processon.com/view/link/6567f4d514cd414d201eb5d2
2.spring生命周期总结
bean的生命周期 * 1.容器完成扫描,ASM技术把扫描到的符合要求的文件读取出来,变成 beanDefinition put到bdMap中 * 2.遍历这个map,依次获取mergedBd,然后进行解析和验证 * 3.调用第一次 getSingleton() 从单例池获取一下这个bean * 4.通过bd获取这个bd所对应的class --- 原先是 ASM - MeteData * 5.通过class信息去推断构造方法 * 6.利用这个构造方法去反射实例化对象 * 7.缓存注入的属性的信息 (放到mergedBeanDefinition进行缓存工作,主要把这个类中加了Autowired * 的属性和方法,放到一个map中,方便后面需要注入属性的时候,直接get) * 8.为循环依赖进行准备工作,判断容器是否支持循环依赖,提前暴露当前的bean工厂 * 9.判断当前容器是否允许属性注入 允许属性注入则完成属性填充 * 10.执行 3个aware接口的回调,beanFactoryAware、beanNameAware、beanClassLoaderAware * 11.执行其它aware如 ApplicationContextAware 和 生命周期初始化回调的注解版 @PostConstruct * 12.执行生命周期回调的接口版和xml版 如 InitializingBean * 13.完成aop * 14.返回对象放到SingletonObjects
可根据图中流程进行对比此生命周期总结,图示更加详细
3.spring扩展接口
* 实现 重写
* 1.
* InstantiationAwareBeanPostProcessor postProcessBeforeInstantiation
* 2.确定构造方法,继而实例化对象
* SmartInstantiationAwareBeanPostProcessor determineCandidateConstructors
* 3.完成了beanDefinition的合并
* MergedBeanDefinitionPostProcessor postProcessMergedBeanDefinition
* 4.主要为了在循环依赖的时候能够从三级缓存当中获取一个扩展好的对象
* SmartInstantiationAwareBeanPostProcessor getEarlyBeanReference
* 5.判断当前容器是否允许属性注入
* InstantiationAwareBeanPostProcessor postProcessAfterInstantiation
* 6.填充属性
* InstantiationAwareBeanPostProcessor postProcessProperties
* 7.执行部分aware接口、执行生命周期的初始化回调 注解版
* BeanPostProcessor postProcessBeforeInitialization
* 8.事件的发布、代理
* BeanPostProcessor postProcessAfterInitialization
对于直接实现 BeanPostProcessor 的类,只能作用在 bean生命周期的:执行生命周期回调注解版 和 Aop 两个阶段 要作用在 bean生命周期的其它阶段,则需要间接实现