没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论


















Spring 源码最难问题:当 Spring
AOP 遇上循环依赖
前言
问:Spring 如何解决循环依赖?
答:Spring 通过提前曝光机制,利用三级缓存解决循环
依赖。
再问:Spring 通过提前曝光,直接曝光到二级缓存已经
可以解决循环依赖问题了,为什么一定要三级缓存?
再细问:如果循环依赖的时候,所有类又都需要 Spring
AOP 自动代理,那 Spring 如何提前曝光?曝光的是原
始 bean 还是代理后的 bean?
这些问题算是 Spring 源码的压轴题了,如果这些问题都
弄 明 白 , 恭 喜 你 顺 利 结 业 Spring 源 码 了 。 就 单 单 对
Spring 这一块的理解,不夸张的说可以达到阿里水准了
源码分析

进 入 正 题 , 在 Spring 创 建 Bean 的 核 心 代 码
doGetBean 中,在实例化 bean 之前,会先尝试从三级
缓存获取 bean,这也是 Spring 解决循环依赖的开始
(一) 缓存中获取 bean
//AbstractBeanFactory.java
protected<T>TdoGetBean(nalStringname,@Nullable
nalClass<T>requiredType,
@NullablenalObject[]args,booleantypeCheckOnly)thro
wsBeansException{
nalStringbeanName=transformedBeanName(name);
Objectbean;
//2.尝试从缓存中获取 bean
ObjectsharedInstance=getSingleton(beanName);
...
}
protectedObjectgetSingleton(StringbeanName,booleana
llowEarlyReference){
//从一级缓存获取,key=beanNamevalue=bean
ObjectsingletonObject=this.singletonObjects.get(beanName
);
if(singletonObject==null&&isSingletonCurrentlyInCreation
(beanName)){
synchronized(this.singletonObjects){
//从二级缓存获取,key=beanNamevalue=bean
singletonObject=this.earlySingletonObjects.get(beanName
);
//是否允许循环引用
if(singletonObject==null&&allowEarlyReference){
/**

*三 级 缓 存 获 取 , key=beanName
value=objectFactory , objectFactory 中 存 储 getObject() 方 法 用 于
获取提前曝光的实例
*
*而为什么不直接将实例缓存到二级缓存,而要多此一举将实例先封装
到 objectFactory 中?
*主要关键点在 getObject()方法并非直接返回实例,而是对实例又使
用
*SmartInstantiationAwareBeanPostProcessor 的
getEarlyBeanReference 方法对 bean 进行处理
*
*也就是说,当 spring 中存在该后置处理器,所有的单例 bean 在实
例化后都会被进行提前曝光到三级缓存中,
*但是并不是所有的 bean 都存在循环依赖,也就是三级缓存到二级缓
存的步骤不一定都会被执行,有可能曝光后直接创建完成,没被提前引用过,
*就直接被加入到一级缓存中。因此可以确保只有提前曝光且被引用的
bean 才会进行该后置处理
*/
ObjectFactory<?>singletonFactory=
this.singletonFactories.get(beanName);
if(singletonFactory!=null){
/**
*通过 getObject()方法获取 bean,通过此方法获取到的实例不单单
是提前曝光出来的实例,
*它 还 经 过 了 SmartInstantiationAwareBeanPostProcessor 的
剩余13页未读,继续阅读
资源评论


jane9872
- 粉丝: 34
- 资源: 5701
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
