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
当你发现自己的才华撑不起野心时,就请安静下来学习吧