前言
Spring的加载机制,一直都不是很清楚,本次通过debug,查了相关源码,整理出整体调用链,为日后学习使用
本文仅自己学习笔记!
AbstractBeanFactory -> DefaultListableBeanFactory
AbstractApplicationContext.refresh
obtainFreshBeanFactory DefaultListableBeanFactory
finishBeanFactoryInitialization
AbstractXmlApplicationContext
loadDefiniton
解析xml
DefaultListableBeanFactory.beanDefinitionMap(beanName, beanDefinition)
DefaultSingletonBeanRegistry 是 DefaultListableBeanFactory 父类
DefaultSingletonBeanRegistry.singletonObjects(beanName, Object)
初始化 applicaionContext
AbstractApplicationContext.refresh()
prepareRefresh()
启动时间 启动状态 initPropertySources(子类实现)
obtainFreshBeanFactory
获取beanFactory DefaultListableBeanFactory
loadBeanDefinitions 加载bean配置 到 DefaultListableBeanFactory.beanDefinitionMap
BeanDefinitionReader.loadBeanDefinitions
AbstractBeanDefinitionReader.loadBeanDefinitions 最终是调用 子类的loadBeanDefinitions 如 XmlBeanDefinitionReader
经过各种xml解析 通过建造者模式 BeanDefinitionHolder 生成 BeanDefinition
加载完成 放入 beanDefinitionMap key:beanName value:BeanDefinition- prepareBeanFactory 给DefaultListableBeanFactory 准备相应的属性 以及 实例化环境所需要的 bean
实例化后存入 DefaultListableBeanFactory.singletonObjects 中- postProcessBeanFactory 子类实现
- invokeBeanFactoryPostProcessors
- registerBeanPostProcessors
- initMessageSource
- initApplicationEventMulticaster
- onRefresh
- registerListeners
finishBeanFactoryInitialization 实例化 beanDefinitionMap 中的 bean non-lazy-init
DefaultListableBeanFactory.preInstantiateSingletons
根据之前的beanDefinitionMap 中的 BeanDefinition 进行实例化
非抽象 单例 非懒加载
AbstractBeanFactory.getBean先看内存中有没有 有就直接取内存中,没有则创建
循环依赖检测
看是否有父工厂
有就用父类工厂创建
内存中标记为创建,存储在 alreadyCreated Set
创建依赖的bean
AbstractAutowireCapableBeanFactory.doCreateBean 创建
createBeanInstance
autowireConstructor
instantiateBean
反射生成bean
生成好了 放入 DefaultListableBeanFactory的 singletonFactories registeredSingletons
populateBean
initializeBean
init-method 执行
提前曝光 处理循环依赖
registerDisposableBeanIfNecessary
之后再放入 singletonObjects registeredSingletons- finishRefresh
清理clearResourceCaches
initLifecycleProcessor
监听