这两天稍微看了一点spring bean生成的源码,算是自己探索了一点点东西,感觉这块稍微明白了一点,下面定义的A和B都是Singleton
注意!:如果A是构造器依赖,B是Setter依赖,A和B循环依赖时,如果先加载的是B,则不会出现循环依赖异常,因为B加载时会先将未依赖A的B实例放入缓存,然后递归到A进行有参数构造器初始化,这时A可以拿到B的实例完成注入,然后B也可以依赖A
但是反过来不行,如果先加载A,那么A会执行有参数的构造器,这时没有A的实例构造出来,缓存中没有A,在构造A前递归构造B,虽然有一个未依赖A的B的实例被放入缓存,但是由于B依赖A没有成功,所以需要递归创建A来依赖,但这时A已经在正在singletonsCurrentlyInCreation中了,所以检测到循环依赖,从而抛出异常
注意2!:上面的这个问题在不开启懒加载时不一定能复现,因为非懒加载模式下的Bean会被依次加载,所以A和B的先后顺序不一定。想要复现需要让A和B都懒加载,然后使用context.getBean(A.class)才能稳定复现,因为这时会先加载A
好久没写博客了,一般的知识点都记在文档里,感觉大家都知道的东西没必要发出来制造垃圾