依赖注入
程序员文章站
2023-12-28 10:43:58
...
概念
什么是依赖
我所需要的 但不是我的 (为了方面讨论 这里的我称之为Consumer 依赖称之为Provider)
例如 空气 食物
什么是依赖注入
互动问答 什么是依赖注入? (将Consumer所依赖的Provider传入到Consumer中)
例如 吃饭 输液
分类
根据实现分类
- 运行时依赖注入
依赖反射 影响性能
互动问答 什么是反射? (程序在运行时获取和修改自身状态和行为的能力)
- 编译时依赖注入
编译时检查 更安全
不依赖反射 性能高
根据注入方法
- 构造器注入
public class Consumer {
private final IProvider mProvider;
public Consumer(IProvider provider) {
mProvider = provider;
}
}
- Setter注入
public class Consumer {
private final IProvider mProvider;
public void setProvider(IProvider provider) {
mProvider = provider;
}
}
优点
- 解耦 不用改变Consumer 就可以改变Provider
例如 近视眼镜是松耦合的 人造器官是紧耦合的
- 控制倒转
针对接口编程 不要对实现编程
public class Consumer {
private final IProvider mProvider;
public Consumer(IProvider provider) {
mProvider = provider;
}
}
- AOP
互动问答 综上所述DI体现了哪些设计原则? (单一职责原则/开放封闭原则/依赖倒转原则)
缺点
- Consumer与Provider耦合 => Consumer和Provider都与依赖注入系统耦合 => 不透明 给逻辑和调试带来成本