Spring启动过程+循环依赖详解
2024-01-18 13:45:59 0 举报
AI智能生成
登录查看完整内容
spring启动过程,各个方法的详细调用链,包括创建bean时对循环依赖的处理过程
作者其他创作
大纲/内容
初始化MessageSource
Main Topic
7.initMessageSource
初始化上下文广播信息
8.initApplicationEventMulticaster
使用方自己去实现,如web项目的话,AbstractRefreshableWebApplicationContext自己去实现
9.onRefresh
注册监听器,监听器就是实现了ApplicationListener的Bean类
10.registerListeners
1.ConversionService,初始化spring类型转换器
2.beanFactory.addEmbeddedValueResolver,创建value变量解析器,通过value注解方式获取配置,就是用该解析器去获取的
3.beanFactory.setTempClassLoader(null)
4.beanFactory.freezeConfiguration
拿到所有的beanDefinitionNames
transformedBeanName
从singletonObjects中获取bean
未获取到再从earlySingletonObjects中获取bean
从singletonFactories中获取bean,获取到了则将bean放入二级缓存,并清除三级缓存中的bean,未获取到则返回null
getSingleton()检查是否在初始化前,该bean已经被手动注入
getObjectForBeanInstance
beanCreation,设置当前bean的状态为创建中
从mergedBeanDefinitions中获取RootBeanDefinition,如果没有获取到,则将beanDefinition合并成RootBeanDefinition,并放入mergedBeanDefinitions中
如果RootBeanDefinition有依赖,则先创建依赖的类
createBean 创建bean,singletonFactory为匿名的ObjectFactory,实现了其中的getObject方法,getObject方法中有createBean方法去创建bean
3.填充属性:populateBean
4.初始化bean:initializeBean
singletonFactory.getObject(),创建bean
调用getSingleton创建bean,传入一个匿名的ObjectFactory,用来创建bean
如果上面没有获取到bean,则创建bean
遍历beanDefinitionNames,第一次遍历,创建bean
再次遍历,第二次遍历,post-initialization callback
5.beanFactory.preInstantiateSingletons 初始化bean
11.finishBeanFactoryInitialization完成bean的初始化以及创建bean
clearResourceCaches
initLifecycleProcessor
getLifecycleProcessor().onRefresh
publishEvent(new ContextRefreshedEvent(this))
12.finishRefresh
refreshBeanFactory
getBeanFactory
1.prepareRefresh
检查上下文中是否已经拥有beanFactory,如果有,则销毁bean及beanFactory,检查方式:AbstractRefreshableApplicationContext中的成员变量beanFactory是否为null
创建一个DefaultListableBeanFactory的beanFactory,负值给AbstractRefreshableApplicationContext的beanFactory
customizeBeanFactory
创建注解阅读器:reader
创建bean包扫描器:saanner
获取beanName生成器:beanNameGenerator
获取元数据解析器:scopeMetadataResolver
将beanDefinition放入beanDefinitionMap中
将beanName放入beanDefinitionNames
将组建创建成AnnotatedGenericBeanDefinition,注册到beanFactory中
注册组建:reader.register(ClassUtils.toClassArray(this.componentClasses))
将类创建成BeanDefinitionHolder,注册到beanFactory中
包扫描:scanner.scan(StringUtils.toStringArray(this.basePackages))
注册配置:reader.register(clazz)
loadBeanDefinitions:包扫描,注册bean的基本信息
返回 AbstractRefreshableApplicationContext 中的成员变量 beanFactory,类型为:DefaultListableBeanFactory
2.obtainFreshBeanFactory初始化 BeanFactory类型为:ConfigurableListableBeanFactory实际类型为:DefaultListableBeanFactory
初始化beanFactory的基础配置,设置类加载器
注册环境变量、系统变量以及配置参数等(properties文件中的配置)
3.prepareBeanFactory
注册一些基本信息及bean的作用域
4.postProcessBeanFactory
执行上一步创建的所有BeanFactoryPostProcessors
5.invokeBeanFactoryPostProcessors
注册beanPostProcessors,添加到beanFactory中
6.registerBeanPostProcessors
AbstractApplicationContext.refresh
收藏
收藏
0 条评论
回复 删除
下一页