IoC与DI
本文最后更新于:3 年前
IoC与DI
- Ioc,即控制反转,把对象的调用权交给容器,通过容器来实现对象的装配和管理
- DI,即依赖注入,对象之间依赖关系由容器在运行期决定,由容器动态的将依赖关系注入到对象之中
- DI 是对 IoC 更完善的描述
DI
- 谁依赖谁?对象实例化依赖容器
- 为什么要依赖?对象实例化通过容器自动得到外部依赖
- 谁注入谁?容器注入对象的依赖到对象中
- 注入了什么?注入了对象的外部依赖
Hyperf 的依赖注入
- 由 hyperf/di 组件提供功能支持
- 更符合长生命周期的应用使用
- 提供了 注解、注解注入、AOP
- 基于 PSR-11 实现,可独立应用于其他框架
- 注入方式
- 通过构造方法注入
- 通过 @Inject 注解注入
- 注入类型
- 简单对象注入
- 我们假设 存在一个。UserService 类
- 我们希望在其他地方引用该类的依赖
- 在类成员属性上定义 @Inject注解,配合@var 的值来完成依赖的注入
- 抽象工厂注入
- 工厂对象注入
- 简单对象注入
注入容器本身
- 直接 Psr\Container\ContainerInterface
- 通过 Hyperf\Utils\ApplicationContext::getContainer() 获得
对注解和 DI 的总结
- PHP 语法上没有支持注解,只能基于约束好的规定去从注释上解析
- 注解只是元数据定义,实现功能时不利用这些数据的话,没任何作用
- 使用了注解的对象必须基于 Hyperf 的DI 容器来创建对象才能生效
- 注解可以用在类、类方法、类成员属性上
- DI 容器是负责管理 对象的创建 和 对象的依赖管理的
- DI 容器创建出来的对象是个单例,是长生命周期对象
- 通过 $container->make() 方法 或者 make() 函数创建短生命周期对象
- 通过 new 来实例化的对象注解不会生效,依赖需自行管理
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!