拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 spring回圈依赖的产生与解决

spring回圈依赖的产生与解决

白鹭 - 2022-03-09 1950 0 0

1.回圈依赖的产生

在spring中物件默认都是单例的 ,意味整个容器中只有一个该类的物件,

如图,B类有一个属性a,A类有一个属性b,当B类创建物件时,要给a属性赋值;当A类创建物件时,要给b属性赋值,从而产生回圈依赖,只要打破当前的倍训,回圈依赖就不存在了,

 

回圈依赖产生的根本就是属性赋值,

 属性复值的方式有两种:

  1. 构造器赋值(回圈依赖的问题是无法解决的)
  2. set方法(通过三级快取来解决)

 

2.回圈依赖的解决

打破当前的倍训,使用三级快取(三个map集合)解决

 

 

半成品: 完成实体化但未完成初始化

成品:完整物件

 

3.三级快取问题决议

 

 

 

3.1三级快取中分别保存的是什么物件
  1:成品物件
  2:半成品物件
  3:lambda表达式

3.2如果只使用1级快取行不行?
  不行,因为成品和半成品物件会放到起,在进行物件获取的时候有可能获取到半成品物件,这样的物件是没法使用的


3.3如果只有二级快取行不行?
  getSingleton
  doCreateBean
  只有二级快取的时候也可以解决回圈依赖的问题,
  添加aop的实作之后,报错,This means that said other beans do not use the final version of the bean.没有使用最终版本的bean物件


3.4 三级快取存在到底做了什么事?
  如果一个物件需要被代理,生成代理物件,那么这个物件需要预先生成非代理物件吗?
  需要


3.5三级快取到底做了什么?
  lambda getEarlyBeanReference().只要搞清楚这个方法的具体执行逻辑即可
  在当前方法中,有可能会用代理物件替换非代理物件,如果没有三级快取的话,那么就无法得到代理物件,换句话说
  在整个容器中,包含了同名物件的代理物件和非代理物件,你觉得可以吗?
  容器中,物件都是单例的,意味着根据名称只能获取一个物件的值, 此时同时存在两个物件的话,使用的时候应该取哪一个? 无法判断
  谁也无法确认什么时候会呼叫当前物件,是在其他物件的执行程序中来进行呼叫的,而不是人为指定的,所以必须要保证容器中任何时候都只
  个物件供外部呼叫,所以在三级快取中,完整了一件代理物件替换非代理物件的作业, 确定回传的是唯一的物件
  三级快取是为了解决在aop代理程序中产生的回圈依赖问题,如果没有aop的话,二级快取足矣解决回圈依赖问题

 

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *