doGetBean解析
2020-05-14 16:15:10 4 举报
Spring单独解析getBean方法
作者其他创作
大纲/内容
存在销毁方法注册到容器
存在父beanFactory
核心创建bean流程
getBean()
获取合并的BeanDefintion重新放入mergeBeanDefinition中
false
获取所有的后置处理器,执行MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
抛出循环依赖异常
mbd.getDependsOn()
true
getParentBeanFactory()
检查并移除beanName标记
执行实现InitializingBean接口的afterPropertiesSet方法和自定义初始化方法
不存在父beanFactory
主要做好两部分数据缓存1:dependentBeanMap 如果A依赖于B,这个map将以B为key,value主要存储依赖于B的Bean2.dependenciesForBeanMap主要存储于A依赖的Bean
普通构造器
beforeSingletonCreation(beanName)
!= null
获取代理bean,实际没有代理成功因为此时bean还没有实例化,可以先获取切点等数据
addSingleton
return bean
==null
针对实现与bean相关的aware接口
执行后置处理器的postProcessAfterInitialization
返回解析出beanClass
getMergedLocalBeanDefinition(beanName)
transformedBeanName(name)
在这方法之前类比我这里的实例,applicationContext= nul;在这方法后,属性值会被赋值
将完全实例并初始化的bean放入单例缓存池中,移除单例工厂(获取早期bean)
获取到bean
第一次从单例缓存池中获取为空
markBeanAsCreated(beanName)
如果存在父级容器应该从父级获取bean如果父级没有则从父级重新创建bean实例缓存起来
将ObjectFactory放入单实例工厂中,可以解决循环依赖问题
bd.getFactoryMethodName() != null
!mbd.postProcessed
如果bean实例是FactoryBean调用getObject()获取真正的Object,是正常的bean直接返回
初始化
没有获取到bean
mbdToUse.prepareMethodOverrides()
存在@Bean
bean == null
mbd.isSingleton()
getSingleton(beanName)
singletonFactory.getObject()
@Bean标识的方法就是factoryMethod
earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&\t\t\t\tisSingletonCurrentlyInCreation(beanName))
标记这个bean存入AlreadyCreated中,如果mergeBeanDefinition中存在该bean则移除
afterSingletonCreation(beanName)
resolvedClass
执行后置处理器,如果实现AppliactionContextAware接口会被先执行赋值
== null
直接返回创建的bean
instanceWrapper
?
getBean(dep)
doGetBean
createBean()
检查下beanName是否排除,然后满足情况下加入singletonsCurrentlyInCreation
0 条评论
下一页