面试二十八、spring循环依赖

参考链接: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设计的在最后一步完成代理的原则。

面试二十八、spring循环依赖

上一篇:设计模式(17):JAVA(17):设计模式(10)代理模式 为其他对象提供一种代理以控制对这个对象的访问


下一篇:1-4python预备知识-查看帮助文档,并且自如的操作帮助文档