参考链接:https://www.cnblogs.com/daimzh/p/13256413.html
1、spring bean 生命周期
实例化、注入属性、初始化、销毁
2、循环依赖例子
2.1、三级缓存
1)一级缓存,存放已经创建好的单例Bean
2)二级缓存,存放实例化,但未注入属性和初始化的对象
3)三级缓存,单例工厂,二级缓存的对象就是这个工厂获取到的对象
1 @Component 2 public class A { 3 // A中注入了B 4 @Autowired 5 private B b; 6 } 7 8 @Component 9 public class B { 10 // B中也注入了A 11 @Autowired 12 private A a; 13 }
1)A实例化,构建一个工厂添加到三级缓存
2)注入属性,发现依赖B
3)B实例化,构建一个工厂添加到三级缓存
4)注入属性,发现依赖A
5)去三级缓存获取A对应的工厂
6)获取到实例化的A对象(如果开启AOP则获取到的是A的代理对象),
并将其放入二级缓存,清除三级缓存的工厂
7)B注入属性a
8)B完成初始化
9)A注入属性b
10)A完成初始化
3、二级缓存是否可以?
1)A实例化,将其放入二级缓存
2)注入属性,发现依赖B
3)B实例化,将其放入二级缓存
4)注入属性,发现依赖A
5)去二级缓存获取A
在开启AOP的情况下,意味着这时需要获取到A的代理,也就是说第一步A实例化后就要完成代理
并将代理的A放入二级缓存,这违背了spring设计的在最后一步完成代理的原则。