举个例子,A 对象内有 B 属性,创建 A 的时候通过名字 getBean 获取 A,getSingleton 发现缓存中没有 A 就去 createBean,实例化后会将工厂方法函数注册到第三级缓存 singletonFactories,然后在注入阶段 getBean 发现 getSingleton 缓存中找不到 B,就去 singletonFactory.getObject 回调调用 createBean 创建 B 对象,B 实例化后注册工厂函数到第三级缓存,然后注入 A 对象,而 getSingleton 这时候是可以在第三级缓存中找到 A 的工厂函数的,调用工厂的 getObject 方法,也就是调用工厂函数内的 getEarlyBeanReference 方法去获取早期 Bean 引用,内部的 A 被 AbstractAutoProxyCreator 后置处理器执行了一遍 AOP 代理,工厂调用得到的对象挪到第二级缓存 earlySingletonObjects,然后返回赋值给 B,这样 B 注入阶段结束,再初始化完成,也就是 createBean 完成,B 通过 addSingleton 挪到一级缓存。之前这个 B 的 getBean 逻辑是 A 调用的,A 完成了注入后,也可以最终完成初始化, createBean 完成,A 通过 addSingleton 挪到一级缓存。
以下是一些关键代码截图 ~~





…
实战中,构造器注入的循环依赖改为 @Autowired。用 prototype 注入失败时改代码。数据源注入失败时用 @Primary 来解决,或者指定 Bean 名称注入。异步的 @Async 如果有循环依赖就用@Lazy。


793

被折叠的 条评论
为什么被折叠?



