0
点赞
收藏
分享

微信扫一扫

随堂笔记8-spring循环依赖

spring循环依赖

// A依赖了B
class A{
public B b;
}
// B依赖了A
class B{
public A a;
}

以上就会出现循环依赖,解决方法,二级三级缓存

  1. bean的生命周期:
  1. spring扫描class文件生成beanDefinition
  2. 根据得到的beanDefinition生成bean
  3. 根据class推断构造方法
  4. 填充属性(依赖注入)
  5. 如果某个对象被aop则要生成代理对象
  6. 把最终的代理对象放入单例池中,下次获取bean时直接从单例池中获取
  1. 三级缓存
  1. 一级缓存 singletonObjects ;里面的bean对象经历了完整的生命周期
  2. 二级缓存 earlySingletonObjects ;是早前的bean对象
  3. 三级缓存 singletonFactories; 是创建早期bean对象的工厂
  1. 如何打破循环依赖
  1. 通过缓存解决,但是存在问题,这个放入缓存中的是原始对象还是代理对象,这个可能导致b依赖a产生冲突

随堂笔记8-spring循环依赖_缓存

  1. 三级缓存 singletonFactories
  1. 首先在bean的生命周期内会构造一个objectFactory存入singletonFactories中,这是一个函数接口,为了创建aop代理对象,如果执行这个则会吧代理对象放入 earlySingletonObjects
  2. 此时对于a而言,当b创建完后,a继续执行生命周期,按照他本身逻辑进行aop,此时会判断当前beanName是否在earlyProxyRefenrences中。经过aop判断后要把a对应的对象放入singletonObjects中,要放入的是代理对象,所以会从earlySingletonObjects中取。至此循环依赖结束
  3. 注意 earlyProxyReferences 这也是一个缓存,记录原始对象是否进行了aop
  1. 为什么一定要三级缓存
  1. 我的理解,为了遵守bean的生命周期设计
  2. 不知何时吧aop代理对象或者原始对象放入earluSingletonObjects中

不恋尘世浮华,不写红尘纷扰



举报

相关推荐

0 条评论