spring之getBean
2020-06-11 17:37:03 0 举报
觉得可以点个赞 谢谢
作者其他创作
大纲/内容
bean == null?
true
RootBeanDefinition mbd
tranformedBeanName
非常重要的一次校验
后置处理器的应用,这里可以修改bean(它已经实例化了哦)
AbstractBeanFactory#doGetBean
bean != null
这里继续回到doGetBean方法
父类
属性注入
is null?
根据type注入
autowireConstrucotr
从缓存中弹出BeanWrapper
保证创建的bean是新的实例
false
getObjectForBeanInstance
singleton
autowireByName
没有属性需要注入,return跳出populateBean方法
applyBeanPostProcessorsBeforeInstantiation
instanceof FactoryBean
使用构造函数初始化
instantiateBean
parent beanname转换
如果从单例模式没有获取bean 则尝试从父类beanFactory中获取
hasInstAwareBpps
这里是InstantiationAwareBeanPostProcessor类型的
applyMergedBeanDefinitionPostProcessors
实现InitializingBean
AOP实现的重要步骤之一
initializeBean
这里是BeanPostProcessor类型的
obtainFromSupplier
bean = getSingleton
激活自定义的init方法
factory::getObject
hasInstantitionAwareBeanPostProcessors
targetType == null?
getScope != null?
applyBeanPostProcessorsAfterInstantiation
fasle
factoryBeanInstanceCache
doCreateBean
运用属性值上面过程只是将属性值解析出来,真正的设置时在该方法中进行的
至此,创建bean的过程就结束了
这里一般也就叫init方法
getParentBeanFactory
走这里就表示存在BeanWrapper
postProcessPropertyValues
ConfiguredScope
bean实例化后置处理器,非常有用的方法,例如spring事务在此实现
确认该bean的class
return
afterPropertiesSet
invokeAwareMethods
beanName.equals(parentBeanName)
factoryMethodName!= null
resolveBeforeInstantiation
获取实例化对象
dependsOn != null?
这里会给InstantiationAwareBeanPostProcessors最后一次改变bean的机会
instantiateUsingFactoryMethod
applyBeanPostProcessorsAfterInitalization
instanceSupplier !=null
applyPropertyValues
invokeInitMethods
从缓存中获取指定的factoryBean
createBean
crateBean
transformedBeanName(parentName)
invokeCustomInitMethod
从单例缓存中获取Bean三级缓存
BeanFactory#getBean
postProcessAfterInstantiation
根据name注入
isSingleton?
getCachedObjectFroFactoryBean
hasInstantiationAwareBeanPostProcessors
containsBeanDefinition?
bean
AbstractAutowireCapableBeanFactory#createBean
return bean
checkDependencies
new RootBeanDefinition()
prototype
创建Bean开始
创建依赖的bean
registerDisposableBeanIfNecessary
Supplier回调
这里是InstantiationAwareBeanPostProcessors类型的
beanName = parentName
注册DisposableBean,Bean销毁的时候后置处理器也会生效了
实例化Bean
populateBean
根据Bean的 scope做不同的处理
other
!= null ?
因为从缓存中获取的Bean有可能不是我们需要的,还需要经过一番处理,才能真正使用
BeanWrapper
创建Bean的核心流程
resolveBeanClass
RootBeandefinition md =getMergedLocalBeanDefinition(beanname)
autowireByType
is earlySingletonExposure?
给BeanPostProcessor后置处理器返回一个代理对象的机会 实现AOP的最重要逻辑之一
addSingletonFactory
处理循环依赖的核心
needsDepCheck?
BeanClassLoaderAware
applyBeanPostProcessorsBeforeInitialization
使用工厂方法初始化
parentnew RootBeanDefinition()
getObjectFromFactoryBean
获取parentBeanFactory递归获取RootBeanDefinition
保证线程安全创建单例bean
pvsToUse== null?
BeanNameAware
检查属性的合法性
初始化Bean
激活Aware方法
getParentName == null
这里是个短路操作,四个中只能由一个去实例化
null?
获取RootBeanDefinition
createBeanInstance
DependentBean校验
BeanFactoryAware
收藏
收藏
0 条评论
下一页