本章讨论下循环依赖的问题
[TOC]
### 什么是循环依赖
循环依赖就是循环引用就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环。
循环依赖和循环调用是有区别的,循环调用是方法之间的环调用,循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误
:
。
### RapPhp 如何解决循环依赖
A B C三个类 在构造方法类出现了循环依赖的问题
Ioc会先通过默认空构造函数将 3 个对象进行创建放到容器中,等全部创建完后,Ioc会根据依赖关系,使用反射机制,调用对应的构造函数;
注意下在循环依赖的时构造函数中a对的向b依赖的c,可能没有依赖完成,所有a在构造函数中调用 b 的方法时,可能会报错(当用到 c时)
### _prepared 方法
`_prepared`是 Ioc中自己定义的一个生命周期方法`_prepared` 会在 对象所有依赖的外部对象全部调用完构造函数时才会执行,在这里去执行不会出现依赖关系导致的空对象问题
### 补充
出现循环依赖是设计上的问题,开发时一定要避免!所以`_prepared`方法大家应该是用不到的,如果用到了,还不如好好想想怎么设计下架构了
请参考《敏捷软件开发:原则、模式与实践》中的“无环依赖”原则
包之间的依赖结构必须是一个直接的无环图形(DAG)。也就是说,在依赖结构中不允许出现环(循环依赖)。
- 序言
- 开始
- 安装 RapPhp
- 应用目录
- 配置文件
- 入口类
- MVC架构
- 控制器基础
- 前置方法
- 拦截器
- 动态路由
- Request和Response
- Cookie和Session
- 模板引擎
- 请求缓存
- 流程图
- 数据库
- 基础使用
- 查询语法
- 查询操作
- where
- order
- limit
- lock
- fields
- join
- distinct
- having
- group
- force
- 查询方法
- 多数据源
- 数据库类型
- Record模型
- 使用Record
- 增删改
- 查找方法
- 数据类型
- 基本类型
- JSON 数据类型
- time
- date
- attach
- const
- 迭代操作
- record 更多方法
- 注入与转json
- 多级缓存
- 多数据源
- 模型生成
- 回调事件
- IOC控制反转
- Ioc基础概念
- 依赖注入
- Scope作用域
- 构造器
- 循环依赖
- AOP面向切面
- AOP使用
- 切面
- AopBuild
- 生成 aop 文件
- 事件勾子
- 执行循序
- Swoole
- Http服务器
- 用户进程
- Context上下文(重要)
- 协程
- 特色功能
- 限流器
- 连接池
- 数据库连接池
- Redis 连接池
- 通用连接池
- Rpc 远程调用
- Rpc服务提供方
- Rpc客户端
- 熔断器与服务降级
- Redis 分布式锁
- 其他功能
- 缓存
- redis
- 文件存储
- 存储简介
- 本地存储
- OSS存储
- 配置
- 日志
- 验证器
- FileUtil
- 数组Util
- Http工具
- 多语言
- 命令行
- 使用命令行
- 生成模型文件
- AOP动态文件生成
- swoole_http服务器
- 自定义命令行
- 异常与调试
- 异常抛出
- 异常处理
- 部署
- URL重写
- DOCKER 镜像(重要)
- 附录
- 回调事件
- 开发规范
- Swoole开发注意点
- 热点行更新排队机制
