造成循环依赖的原因 A依赖B B依赖A,这都知道
1.首先spring在创建一个A对象时,会把这个beanName放到一个Set集合中,在这个集合里的都是正在创建的Bean。
2.通过反射得到一个Bean,把这个bean,beanName,bean的定义,放到三级缓存中。
3.填充属性B。属性会先从单例池中找,找到直接赋值。找不到就会去判断Set集合中是否有这个beanName,此时这个Set中还没有B。所以spring会去创建B。创建B时发现需要一个A属性,同样会在Set集合中找,发现A在Set集合中,此时spring就知道出现了循环依赖的问题。于是去二级缓存earlySingletonObjects里找A的代理对象。找到了也就赋值了并完成B的创建了。但是A当前没有进行AOP还没有代理对象,所以A会提前AOP,需要在三级缓存中获取这个bean,和beanName。然后进行AOP。获得一个不完整的代理对象,再把这个不完整的代理对象放入二级缓存中,然后把三级缓存中的这个bean放到一个叫earlyProxyReferences的Map中。删除三级缓存中的bean,beanName。
4.其他事情
5.判断是否还需要AOP,从earlyProxyReferences这个Map中获取当前的Bean,如果有就说明已经AOP过了。如果没有就要调用postProcessAfterInitialization()方法进行AOP
6.其他事情
7.把Bean放入单例池
8.把当前Bean在Set中移除。