設計思想,非技術實現。傳統開發中,對象主動 new 依賴(正轉);IoC 容器接管對象創建、生命周期、依賴組裝(反轉)。
IoC 的具體實現方式。Martin Fowler 2004 年命名,更具體描述:「容器動態將依賴注入組件」。
IoC 與 DI 是同一概念不同視角:IoC 強調控制權轉移,DI 強調注入動作。Spring 文檔多用 DI。
「別找我們,我們找你」—— 容器主動發現並注入依賴,對象被動接受。最大改變是主從換位:應用程序從老大變被動等待者。
無 Spring 時:A 需 B → A new B() → 緊耦合
有 Spring 時:A 需 B → 聲明依賴 → 容器創建 B → 注入 A → 鬆耦合
依賴關系重心轉移:雙方都依賴容器,通過容器建立關系。
| 能力 | 說明 |
|---|---|
| 鬆耦合 | 接口編程 + 依賴注入,實現類間零硬編碼依賴 |
| 可測試性 | 單元測試輕松 Mock 依賴,無需啟動容器 |
| 功能復用 | Bean 定義複用,配置元數據驅動 |
| 架構靈活 | 支持多種注入方式(構造器/Setter/字段)、作用域、生命周期回調 |
| AOP 基石 | 代理模式實現橫切關注點分離,依賴容器管理 Bean 生命周期 |
// 構造器注入(推薦:不可變、必需依賴、易測試)
@Component
public class OrderService {
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) { // 隱式 @Autowired
this.paymentService = paymentService;
}
}
// Setter 注入(可選依賴、可重配置)
@Autowired(required = false)
public void setPaymentService(PaymentService paymentService) { ... }
// 字段注入(簡潔但難測試、隱式依賴,不推薦生產)
@Autowired
private PaymentService paymentService;
@Value("${key}") + application.yml