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

Spring IoC 與 DI 通俗解讀:從「自己找女友」到「婚介所托管」的控制反轉

     編輯:Java 綜合教學

Spring IoC 與 DI 通俗解讀:從「自己找女友」到「婚介所托管」的控制反轉

IoC(Inversion of Control,控制反轉)是 Spring 核心。傳統開發中,對象自行創建、查找、銷毀依賴(如 `new Connection()`、JNDI 查找),導致高耦合。Spring 引入容器托管對象生命週期與依賴關係,實現控制反轉。DI(Dependency Injection,依賴注入)是具體實現手段。

生活化類比:找女友

階段傳統模式(無 IoC)Spring IoC 模式
角色你(對象)你(對象)
目標女友(依賴對象)女友(依賴對象)
過程自己到處尋找、打聽興趣、刷臉、送禮、表白... 全程自己掌控委託婚介所(容器):填寫需求單(配置),婚介所按要求推薦,你只管談戀愛
控制權你控制女友對象的創建/銷毀婚介所控制女友對象的生命週期
耦合度高:你綁定具體女友實現低:你依賴抽象「女友介面」,具體實現由容器注入
異常處理自己處理各種拒絕、分手不符合要求拋出異常,容器統一攔截

技術本質

  • IoC 容器:管理所有 Bean 定義(`ApplicationContext`),負責實例化、屬性賦值、初始化回調、銷毀回調。
  • Bean 定義:XML ``、註解 `@Component`/`@Service`/`@Repository`/`@Controller`、Java Config `@Bean`。
  • 依賴注入方式:
      1. **構造器注入**(強依賴、不可變、推薦)
      2. **Setter 注入**(可選依賴、可重配置)
      3. **字段注入 `@Autowired`**(簡潔但難測試、隱式依賴)
  • 反射機制:Spring 利用 Java 反射在運行期動態實例化類、調用方法、設置字段,實現非侵入式注入。

代碼對比

// 傳統:高耦合,難測試
public class UserService {
    private UserDao userDao = new UserDaoImpl();  // 綁定具體實現
}

// Spring IoC + 構造器注入:低耦合,易測試
@Service
public class UserService {
    private final UserDao userDao;
    @Autowired
    public UserService(UserDao userDao) { this.userDao = userDao; }
}

// 單元測試時可直接傳入 Mockito.mock(UserDao.class)

核心價值

  1. 解耦:業務邏輯與對象創建/查找分離。
  2. 可測試性:依賴可替換為 Mock/Stub。
  3. 統一管理:單例/原型/請求/會話作用域、生命週期回調、AOP 織入切點。
  4. 配置外部化:環境差異(dev/test/prod)通過 Profile/屬性文件切換,代碼零修改。

常見誤區

  • 以為 IoC = DI。IoC 是設計原則,DI 是實現手段(還有 Service Locator 模式)。
  • 濫用 `@Autowired` 字段注入導致構造器為空、無法在非 Spring 環境實例化。
  • 將所有類納入容器管理,連工具類、DTO 也掃描,啟動緩慢、上下文膨脹。

總結

Spring IoC 如同婚介所,將「對象創建與綁定」的控制權從業務代碼收回容器,通過 DI 將依賴「推」給對象。理解這一點,Spring 核心架構便豁然開朗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved