Bean实例化(getBean)过程
2021-06-10 16:52:37 0 举报
Bean实例化(getBean)过程
作者其他创作
大纲/内容
beforePrototypeCreation
如果有InstantiationAwareBeanPostProcessor存在,给这个处理器一个执行的机会,如果创建处理Bean返回这个处理器创建的Bean
createBean
是
否
Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16))存储当前正在新建的Bean名称用于判断是否存在于singletonsCurrentlyInCreation判断是否正在新建的Bean
返回null
有
开始
2否
返回获取到的Bean
afterSingletonCreation
获取并删除
BeanName是否有FactoryBean的名称前缀&
执行BeanPostProcessor的postProcessBeforeInitialization
是否获取到Bean
执行这个FactoryBean的getObject
创建实例并放入二级缓存同时删除三级缓存
使用父级创建Bean实例
执行init-method执行InitializingBean的afterPropertiesSet
1是否存在于singletonObjects
返回获取到的实例
从三级缓存中取Factory
getObjectForBeanInstance
MergedBeanDefinitionPostProcessor
返回创建的Bean
如果是单例且为正在创建的,添加至三级缓存删除二级值为lambda表达式调用的getEarlyBeanReference
单独说明此过程
SimpleInstantiationStrategy#instantiate
3是
是否还没有创建完成并且是正在新建的Bean
获取到的Bean实例是否为FactoryBean类型
获取到
添加Bean到单例容器增一删二三
返回当前实例
三级缓存是否有
获取到的Bean实例必须为FactoryBean类型,如果是返回这个实例,不是抛出BeanIsNotAFactoryException异常
populateBean填充Bean属性,包括Autowire,需要Autowire的调用getBean,此时会处理循环依赖
Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256))已经完成创建的Bean名称
未获取到
处理DependsOn的Bean
存在循环依赖从半成品缓存(二级)中取Bean
标记当前Bean为Created
执行BeanPostProcessor的postProcessAfterInitialization
BeanUtils#instantiateClass
二级缓存中是否有
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
反射调用构造方法创建实例
getSingleton
afterPrototypeCreation
beforeSingletonCreation
存在父级BeanFactory且当前Bean不存在于当前BeanFactory中
spring.beans.instantiateBean实例化
ObjectFactory.getObject()
如果以在多例流程中创建此Bean抛出BeanCurrentlyInCreationException异常
是否单例Bean
invokeAwareMethods执行aware接口的处理
doCreateBean
FactoryBean可用于自定义Bean实例化过程例如:先要有一个实现了FactoryBean接口的名称为myFactoryBean的BeanA a = annotationConfigApplicationContext.getBean(\"myFactoryBean\
收藏
收藏
0 条评论
下一页