Spring动态代理(AOP)适配支持循环依赖源码逻辑
2022-12-17 15:42:28 0 举报
AOP+循环依赖源码解读
作者其他创作
大纲/内容
提前暴露单实例。专门来解决循环引用问题
如果之前解决了aop循环依赖,则缓存中放置了提前生成的代理对象,然后使用原始bean继续执行初始化,所以需要再返回最终bean前,把原始bean置换为代理对象返回
AbstractAutoProxyCreator
遍历工厂内的所有后处理器,让exposedObject经过每个SmartInstantiationAwareBeanPostProcessor的包装
mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName)
earlyProxyReferences
earlySingletonExposure
0.标记bean为创建中
没有,依次在一级、二级缓存中拿,不包括三级缓存
检查早期缓存中是否存在这个组件
放入1级缓存删除2、3级缓存
finishBeanFactoryInitialization(beanFactory)
没有,依次在一级、二级、三级缓存中拿
拿缓存的方法和次序
AbstractBeanFactory
先检查单实例bean的缓存
AbstractAutowireCapableBeanFactory
使用
getSingleton(beanName)
getBean(beanName)
破环处
beforeSingletonCreation(beanName)
AbstractApplicationContext
重要判断变量
判断当前bean是否需要提前曝光:单例&允许循环依赖&当前bean正在创建中,判断是否存在循环依赖
判断是否正在创建
拿3级缓存中的lambda生成半成品放入2级缓存删除3级缓存中的lambda
applyBeanPostProcessorsBeforeInitialization
aba,a再次进来,返回半成品,完成b中a属性的赋值
DefaultSingletonBeanRegistry
1.调用lambda创建对象
BeanDefinitionValueResolver
三级缓存中的Bean也会被后置处理来增强
beanFactory.preInstantiateSingletons()
如果没有AOP则会走SmartInstantiationAwareBeanPostProcessor的默认实现,返回bean
闭环处
Set<String> singletonsCurrentlyInCreation
applyBeanPostProcessorsAfterInitialization
DefaultListableBeanFactory
return earlySingletonReference
invokeInitMethods
postProcessAfterInitialization
如果有AOP则会走AbstractAutoProxyCreator的实现,返回proxy
如果有AOP并且存在循环引用,那么上面getEarlyBeanReference方法就执行了,在初始化完成后的后置处理器中就不需要再生成代理对象了,通过earlyProxyReferences进行判断
this.beanFactory.getBean(resolvedName)
2.放入三级缓存
singletonFactory.getObject()
0 条评论
回复 删除
下一页