spring三级缓存,解决循环依赖问题

发布时间 2023-07-11 16:38:43作者: CodingOneTheWay

循环依赖的两种情况

  1. 构造器循环依赖
  2. setter注入的循环依赖

也分为

  1. singleton 支持循环依赖
  2. prototype 不支持循环依赖
  3. @Score是IOC容器的作用域 ;singleton 单实例的;prototype 多实例的(每次获取Bean的时候会有一个新的实例);reqeust 每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前。

 

 

 

 

prototype的场景

构造器

 setter注入

不支持循环依赖的原因

(BoyFriend)applicationContext.getBean("boyFriend") ->  AbstractBeanFactory#doGetBean() -> isPropertypeCurrentlyInCreation(beanName) 为true, 则是发生了递归,则直接抛出异常。

 

解决循环依赖的关键,就是单例的三级缓存。

单例是唯一的,所以三级缓存不能支持prototype。

 

构造器singleton的循环依赖解决

AbstractAutowireCapableBeanFactory#doCreateBean ->

  • setter方法用: addSingletonFactory()  将属性还没有被赋值的bean实例放到三级缓存里。 -> popluateBean()循环给属性赋值 ->   
  • 构造器用:

 执行了autowireConstructor();

 

 

 

@Lazy

https://www.jb51.net/article/221554.htm