Spring运行流程
2024-03-10 12:17:31 11 举报
运行流程、循环依赖
作者其他创作
大纲/内容
循环依赖A依赖属性B,先创建Bthis.beanFactory.getBean(resolvedName)
prepareRefresh()
从二级缓存中获取对象this.earlySingletonObjects.get(beanName)
Y/N
加载BeanDifinitions
Annotation
反射
还记得我们实例化对象完成之后添加的三级缓存吗
完成此上下文的 bean 工厂的初始化,初始化所有剩余的单例对象
prepareBeanFactory(beanFactory)
XmlWeb
属性赋值完成之后调用一些扩展点方法
无操作,留给子类实现
new ClasspathXmlApplication(\"application.xml\")
国际化相关
getSingleton(String beanName)
loadBeanDefinitions(beanFactory)
getSingleton(beanName,allowEarlyReference)
this.singletonObjects.get(beanName)
解析属性值
beanFactory.preInstantiateSingletons()
添加一级缓存移除二级缓存
注册监听器到事件多播器中
registerListeners()
放入三级缓存【beanName - ObjectFactory】
从二级缓存找有没有完成实例化但是还没有复制的半成品对象
refresh()
initApplicationEventMulticaster()
从一级缓存找有没有已经完成的成品对象
postProcessBeanFactory(beanFactory)
singletonFactory.getObject()
BeanUtils.instantiateClass(constructorToUse)
调用BeanFactoryPostProcessors
Xml
返回提前暴露的对象
this.earlySingletonObjects.get(beanName)
初始化Bean
注册其 DisposableBean 接口和/或要在工厂关闭时调用的给定 destroy 方法(如果适用)。仅适用于单例
getBean(beanName)
- 注册类加载器- 设置表达式解析器- 注册 ApplicationContextAwareProcessor(处理ApplicationContext的Aware的接口)- 忽略一些Aware 接口的依赖- 注册可解析的依赖- 注册ApplicationListenerDetector(用于检查Bean是否是ApplicationListener的实现类)- 注册环境相关的 Bean
registerBeanPostProcessors(beanFactory)
准备环境
给属性赋值
对beanFactory进行一些配置操作
finishBeanFactoryInitialization(beanFactory)
ctor.newInstance()
finishRefresh()
initMessageSource()
初始化应用程序事件多播器
onRefresh()
将配置转换为BeanDefinitions
对 BeanPostProcessor 进行分类、排序,然后依次将它们注册到 BeanFactory
删除三级缓存objectFactory添加二级缓存
实例化所有剩余的单例对象
beanFactory=obtainFreshBeanFactory()
清理资源缓存、初始化生命周期处理器、将刷新事件传播到生命周期处理器、 发布最终的上下文刷新事件
invokeBeanFactoryPostProcessors(beanFactory)
instantiateSingleton()
beanFactory = createBeanFactory()
收藏
0 条评论
回复 删除
下一页