AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
本章讨论下循环依赖的问题 [TOC] ### 什么是循环依赖 循环依赖就是循环引用就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环。 循环依赖和循环调用是有区别的,循环调用是方法之间的环调用,循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误 :![](https://box.kancloud.cn/2016-05-12_57348071a4095.JPG) 。 ### RapPhp 如何解决循环依赖 A B C三个类 在构造方法类出现了循环依赖的问题 Ioc会先通过默认空构造函数将 3 个对象进行创建放到容器中,等全部创建完后,Ioc会根据依赖关系,使用反射机制,调用对应的构造函数; 注意下在循环依赖的时构造函数中a对的向b依赖的c,可能没有依赖完成,所有a在构造函数中调用 b 的方法时,可能会报错(当用到 c时) ### _prepared 方法 `_prepared`是 Ioc中自己定义的一个生命周期方法`_prepared` 会在 对象所有依赖的外部对象全部调用完构造函数时才会执行,在这里去执行不会出现依赖关系导致的空对象问题 ### 补充 出现循环依赖是设计上的问题,开发时一定要避免!所以`_prepared`方法大家应该是用不到的,如果用到了,还不如好好想想怎么设计下架构了 请参考《敏捷软件开发:原则、模式与实践》中的“无环依赖”原则 包之间的依赖结构必须是一个直接的无环图形(DAG)。也就是说,在依赖结构中不允许出现环(循环依赖)。