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