不太标准的理解依赖注入
就是将一个类引入另一个类
注入类型
简单对象注入
- 使用构造方法
在构造方法的参数上声明一个与依赖名相同的参数类型
- 使用注解
通过 [@Inject](#)
配合 [@var](#) 属性名
在声明一个与 var 同名的属性 即可实现
抽象对象注入
简单点看就是接口与其实现类的关系 , 先定义一个接口 , 它的实现类是谁并不重要 , 可以通过配置文件来为这个接口分配实现类 , 以后修改时很方便 , 只需要修改一下这个接口的实现类
使用时通过 [@Inject](#)
配合 [@var](#) 接口名
再定义一个属性 , 这样需要更改时只需要在配置文件中修改一下接口与实现的绑定关系
分配接口的实现类
使用
工厂对象注入
通过 DI 生成的对象或属性是全局的 , 他们只能是固定的 , 不应该和请求相关 , 可以是从配置文件中取出的配置 , 可以是依赖
使用 __invoke()
方法来完成对象的生产
当配置文件来进行接口的实现的绑定的时候(或者说 注入给接口的时候), 会注入__invoke()
返回的实例
compact 函数是取当前方法中与字符串同名的值, 返回一个数组 , key是这个字符串 , value 是这个字符串同名的值
下面的代码讲解
注入一个依赖 ContainerInterface 赋值给 container , 通过 container 中的get 方法取出配置类的实例 也就是 ConfigInterface 的实例 , 然后通过这个实例取出 cache.enable 的配置
最后将这个配置 , 传入 UserService 的构造函数, 再返回已经执行过构造函数的 UserService 的实例
这课程真 tm 绕 , 反反复复看了好多遍