spring 循环依赖
spring 循环依赖
AService 出现了循环依赖的情况下---->对 AService 提前进行 AOP
aService Bean 的生命周期
creatingSet<aService>
实例化-- -AService 不完整对象 (new AService()) 原始对象--- >第三级缓存
<' aService',lambda(AService原始对 象, beanName, BeanDefinition)>
填充 bService 属性- --- >从单例池找 bService--->找不到-->创建 bService
bService Bean 的生命周期
2.1. 实例化--- BService 对象(new BService())
2.2. 填充 aService 属性-- >从单例池找 aService--->找不到-->aService 正在创建中-- >aService 出现了循环--->第二级缓存--->第三级缓存-->执行 lambda--->--- >提前 AOP--- >AService 代理对象--->第二级缓存<' aService', AService 代理对象>
2.3. 填充其他属性
2.4. 做其他事情
2.5. 放入单例池
填充 cService 属性
做其他事情--- -AOP--- >原始对象被代理对象--- -》AService 代理对象 4.5 从第二级缓存取出 AService 代理对象
放入单例池
creatingSet . remove( ' aservice')
三级缓存
第一级缓存:单例池 singletonObjects ConcurrentHashMap <beanName, bean 对象>
第二级缓存: earlySingletonObjects HashMap <beanName, bean 对象>
第三级缓存:singletonFactories HashMap <beanName, ObjectFactory( lambda 表达式>
一级缓存存的是完整的对象 二级缓存和三级缓存存的是不完整的对象
一级缓存使用 ConcurrentHashMap 保证原子性
二级缓存和三级缓存两个是一个原子操作 使用 synchronized 来保证
总结
这篇文章从 Spring 一个实例的生命周期说起,包括如何进行实例化,在实例化过程中涉及到循环依赖的问题,了解到 Spring 是如何使用三级缓存来解决循环依赖问题的,并从源码角度看了一下三级缓存的实现过程,一级缓存存的是完整的对象,使用 ConcurrentHashMap 保证原子性二级缓存和三级缓存存的是不完整的对象,使用 synchronized 来保证原子性,希望这篇文章对你有所帮助,喜欢这篇文章的话就给我点个赞吧!
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/134b8c3ab1c78a2eb38650f98】。文章转载请联系作者。
评论