循环依赖的两种情况
- 构造器循环依赖
- setter注入的循环依赖
也分为
- singleton 支持循环依赖
- prototype 不支持循环依赖
-
@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