DI(依赖注入 Dependency Injection)是一种实现手段;
IOC(控制反转 Inversion of Control)是达到的设计思想 / 效果。
一、传统模式:正方向控制(没有 IOC)
定义:对象自己负责创建依赖
假设:ProductService 需要数据库会话 AsyncSession
class ProductService:
def __init__(self):
# ❌ 自己内部创建依赖
self.db = get_session_factory()()
执行流程:
- 创建
ProductService - Service 内部主动新建 Session
控制权:Service 主动掌控依赖的创建、生命周期
👉 控制权在业务类内部(正向控制)
缺点:
- 强耦合:
ProductService硬编码依赖构造方式,难以单元测试; - 无法灵活替换依赖(测试想传入 mock Session 很难);
- 依赖统一管理困难,生命周期分散;
二、IOC 控制反转(Inversion of Control)
反转 = 控制权调换: 业务类不再自己创建依赖,由外部容器创建好依赖,再交给业务类。
业务类只负责使用依赖,不负责制造依赖。
控制权转移:
原来:Service → 创建 Session
反转后:外部容器 → 创建 Session → 传给 Service
这就是控制反转 IOC。
IOC 是思想,不是代码。如何实现这种反转?最主流方案:DI 依赖注入。
三、DI 依赖注入 Dependency Injection
把类所需要的外部依赖,通过外部传入,而不是内部 new。
三种注入方式:
- 构造函数注入
- 属性注入
- 方法注入




