首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring IoC 與 DI 深度理解:控制反轉、依賴注入、好萊塢法則、容器核心機制

     編輯:Java 相關知識

核心概念辨析

IoC (Inversion of Control) - 控制反轉

設計思想,非技術實現。傳統開發中,對象主動 new 依賴(正轉);IoC 容器接管對象創建、生命周期、依賴組裝(反轉)。

  • 誰控制誰:容器控制對象
  • 控制什麼:對象創建、依賴獲取、生命周期
  • 為何反轉:主動→被動,對象等待容器注入
  • 哪些方面反轉:依賴對象獲取方式

DI (Dependency Injection) - 依賴注入

IoC 的具體實現方式。Martin Fowler 2004 年命名,更具體描述:「容器動態將依賴注入組件」。

  • 誰依賴誰:應用程序依賴容器
  • 為什麼依賴:需要外部資源(對象、配置、文件)
  • 誰注入誰:容器注入應用對象
  • 注入什麼:依賴對象、資源、常量
IoC 與 DI 是同一概念不同視角:IoC 強調控制權轉移,DI 強調注入動作。Spring 文檔多用 DI。

三大權威解讀

1. Iteye 開濤:好萊塢法則

「別找我們,我們找你」—— 容器主動發現並注入依賴,對象被動接受。最大改變是主從換位:應用程序從老大變被動等待者。

2. Bromon:婚介所比喻

  • 傳統:自己找女朋友(主動 new、管理生命周期)
  • IoC:婚介所(容器)管理資源,提交需求清單,匹配注入
  • DI:打針——運行期動態注入 Connection 等依賴,基於反射實現

3. 筆者理解:協作關系重構

無 Spring 時:A 需 B → A new B() → 緊耦合
有 Spring 時:A 需 B → 聲明依賴 → 容器創建 B → 注入 A → 鬆耦合
依賴關系重心轉移:雙方都依賴容器,通過容器建立關系。

Spring 容器核心價值

能力說明
鬆耦合接口編程 + 依賴注入,實現類間零硬編碼依賴
可測試性單元測試輕松 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;

最佳實踐總結

  1. 優先構造器注入,保證不可變性與依賴完整性
  2. 業務邏輯類無狀態化,適合單例作用域
  3. 配置外部化:@Value("${key}") + application.yml
  4. 善用Profile 區分環境配置
  5. 理解Bean 生命周期:實例化 → 屬性注入 → 初始化 → 銷毀
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved