spring循环依赖解决

循环依赖的发生:

  循环依赖发生类似于java中的线程死锁,A实例化需要依赖B,B实例化需要依赖A,如此陷入依赖循环,就出现了循环依赖。

解决思路:

  A实例化的时候由于需要依赖B,A此时处于无法实例化状态(B此时没有实例化,无法依赖),所以可以将半实例化的A做一个伪实例化声明(Spring中的第三级缓存),那么B实例化的时候,就可以找到需要依赖的A(虽然是假的,但是可以让B继续往下走),这样B可以顺利实例化完成,之后A再实例化就发现B可以正常依赖了,A也可以继续实例化了。这样就解决了循环依赖问题。

Spring的解决方式:

使用@lazy注解,加了lazy的原理如下:

  • A的创建: A a=new A();
  • 属性注入:发现需要B,查询字段b的所有注解,发现有@lazy注解,那么就不直接创建B了,而是使用动态代理创建一个代理类B
  • 此时A跟B就不是相互依赖了,变成了A依赖一个代理类B1,B依赖A
原文地址:https://www.cnblogs.com/smallVampire/p/13273269.html