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来保证
代码语言:javascript复制protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 检查一级缓存singletonObject中是否存在实例
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
// 如果一级缓存中不存在且当前beanName正在被创建,则锁定一级缓存尝试从二三级缓存中获取
synchronized (this.singletonObjects) {
// 从二级缓存中进行查找,二级缓存为普通HashMap,因为在同步代码块中不会发生并发问题
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
// 当某些方法需要提前初始化的时候则会调用addSingletonFactory方法将对应的ObjectFactory初始化策略存储在三级缓存singletonFactories
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
// 如果singletonFactory中存在,调用预先设定的getObject方法获取bean
singletonObject = singletonFactory.getObject();
// 记录在二级缓存中,三级缓存删除,earlySingletonObjects和singletonFactories互斥
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}