IoC与DI

本文最后更新于:3 年前

IoC与DI

  • Ioc,即控制反转,把对象的调用权交给容器,通过容器来实现对象的装配和管理
  • DI,即依赖注入,对象之间依赖关系由容器在运行期决定,由容器动态的将依赖关系注入到对象之中
  • DI 是对 IoC 更完善的描述

DI

  • 谁依赖谁?对象实例化依赖容器
  • 为什么要依赖?对象实例化通过容器自动得到外部依赖
  • 谁注入谁?容器注入对象的依赖到对象中
  • 注入了什么?注入了对象的外部依赖

Hyperf 的依赖注入

  • 由 hyperf/di 组件提供功能支持
  • 更符合长生命周期的应用使用
  • 提供了 注解、注解注入、AOP
  • 基于 PSR-11 实现,可独立应用于其他框架
  1. 注入方式
    • 通过构造方法注入
    • 通过 @Inject 注解注入
  2. 注入类型
    • 简单对象注入
      • 我们假设 存在一个。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 协议 ,转载请注明出处!